C言語習得中の文系学生です。現在、データ構造(リンクリスト、ツリー構造)を勉強中です。
勉強用にプログラムを組んでるのですが、構造体メンバに文字列を代入し出力する関数で予想とは違う結果が出てしまいました。思いつく限りの方法は試しましたが、状況は変わりませんでした。
先に、予想した実行結果と実際の実行結果を載せます。
char型配列data[32]に入力文字列を代入し出力した時
・予想した結果
入力: abcdefgh
出力: abcdefgh
・実際の結果
入力: abcdefgh
出力: abc
次にコードと実行結果を載せます。
上記の通り、与えられた文字をそのまま出力するだけのプログラムです。
質問投稿用にメンバの量は1つにしました。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define MAX_DATA 32
struct memb{
char s[MAX_DATA];
}k;
void input_c(char *data){
data = (char *)malloc( sizeof(char)*32 );
printf("Size is %d\n",malloc_usable_size(data));
puts(">>> ");
fgets(data,sizeof(data),stdin);
sscanf(data,"%s",data);
printf("DATA is %s\n",data);
}
int main(void){
input_c(k.s);
printf("Inputted Data : %s\n",k.s);
return 0;
}
--------------------------------------------
実行結果
Size is 36
>>>
abcdefgh
DATA is abc
Inputted Data :
以上です。
こういう状態になってしまう原因がどこにあるのか、何がそうさせているのかについて、
どうかご教授のほど宜しくお願い致します。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
>xを0で初期化
>xをパラメータとしてinput関数に渡す
>5を入力
>ここでスタックには0がプッシュされたままで5がプッシュされる
実際に動かしてみた方がわかると思いますが……。
スタックがどうとかはこの場合関係ないです。
ローカル変数の値がどうなるか?です。
質問に掲示されたヤツだと…ポインタ使うのでそれぞれ下記のようにしてみてはどうですかね?
input_c(k.s);
の前に
printf("k.s Address 0x%p\n", k.s);
でk.sのアドレスを表示してみる。
data = (char *)malloc( sizeof(char)*32 );
の前後で
printf("data Address 0x%p\n", data);
でdataの指す先がどう変化するか確認する。
sizeof()がおかしいのは既に指摘されてます。
# 配列のポインタを引数にして関数コールしてもコールされた側ではその配列のサイズを知る手段がありません。
# 引数でサイズも渡す。というのがよくある方法です。
>sscanf(data,"%s",data);
取り出し元と書き出し先が同一領域で問題ないのか?
については確認が必要かも知れません。
まぁ、仮に大丈夫だったとしても上記の処理では意味がありませんが。(ホワイトスペースで読み取りが終わる…かな?)
ちなみに…input_c()の中でメモリリーク起きてます。
# malloc()で取得したヒープはいつ解放はてます?
# 答え:プロセスが終了した時にOSが回収する。
# じゃあ、プロセスが終了しない場合はどうなるでしょうかね。
No.3
- 回答日時:
sizeof(data)がおかしい。
dataはmallocしたバッファへのポインタであってバッファそのものではないからsizeof(data)はバッファ長ではなくポインタのサイズ。
このシステムでは32ビットだったので4が返ってきたのだろう。
よってfgets(data,sizeof(data),stdin);では
'a','b','c',0x00が入る。
>dataはmallocしたバッファへのポインタであってバッファそのものではないからsizeof(data)はバッファ長ではなくポインタのサイズ。
全くその通りです・・・ありがとうございました!!
No.2
- 回答日時:
すみません, #1 の最後の行はゴミなので無視してください.
ちなみに「質問のプログラムではポインタを渡しているので #1 のプログラムとは違う」という指摘は却下.
この回答への補足
わかりそうでわかりませんが・・・
5を入力した時の実行結果
5
5
0
xを0で初期化
パラメータとして渡す5
スタックには0がプッシュされたままで5がプッシュされる
input関数で5を出力
main関数で5を出力
(ここまででスタックから5がポップされる)
最後に残った0がポップされ出力される
ということでしょうか・・・
これが正しいとした上での質問ですが、これはprintf関数によるものですか?
スタックだのヒープだのよくわからないんです…
もしご存知であれば参考書やホームページ等を教えていただけますか?
一部打ち間違えたまま投稿してしまいました
すみません
訂正します
xを0で初期化
xをパラメータとしてinput関数に渡す
5を入力
ここでスタックには0がプッシュされたままで5がプッシュされる
input関数で5を出力
main関数で5を出力
(ここまででスタックから5がポップされる)
最後に残った0がポップされ出力される
以上訂正です。
No.1
- 回答日時:
#include <stdio.h>
void input(int x)
{
scanf("%d", &x);
printf("%d\n", x);
}
int main()
{
int x = 0;
input(x);
printf("%d\n", x);
return 0;
}
というプログラムは, どう動くでしょうか?
printf("
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
VC++でSQLへSELECT文を送ったの...
-
C++で指定文字列のカウント方法...
-
C言語でのCSVファイルの読み出...
-
構造体メンバの初期化
-
static付き宣言の初期化
-
printf による16進表示について
-
エラーについて質問です。
-
fread(),fwrite()等について
-
いつもお世話になっております...
-
矢印キーを押下してコンソール...
-
Ç言語でファイルサイズを変更す...
-
c言語で文書を読み込み、単語の...
-
空白を含んだ文字列がうまく格...
-
[C言語 Windows] Visual Cでの...
-
C言語についてです。
-
fgetsなどのときのstdinのバッ...
-
「指定されたキャストは有効で...
-
マイナスからプラスへ転じた時...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
#defineが使用するメモリ領域に...
-
printf による16進表示について
-
空白を含んだ文字列がうまく格...
-
C言語のプログラムで、途中で止...
-
プログラミングの授業の課題です
-
char型2つを結合し、short型に...
-
C言語でのCSVファイルの読み出...
-
矢印キーを押下してコンソール...
-
【C言語】全角文字の配列を、全...
-
エラーについて質問です。
-
リストの作成と出力(C言語)
-
バイナリファイル(画像)のよみ...
-
[C]セグメンテーションエラー:...
-
WinInetのInternetOpenUrl関数...
-
c言語で文書を読み込み、単語の...
-
VC++でSQLへSELECT文を送ったの...
-
受信データから必要な部分のみ...
-
reallocでエラー
おすすめ情報