14

次のコードを書きました。

int main(){
   char arrays[12];
   char *pointers;
   scanf("%s",arrays);
   scanf("%s",pointers);
   printf("%s",arrays);
   printf("%s",pointers);
   return 0;
}

`scanf("%s",pointers) と書くとエラーになるのはなぜですか?

4

6 に答える 6

15
char *pointers; 

pointers初期化する必要があります。何らかのアドレスを指すまで、文字列をスキャンすることはできません。コンピュータは、キーボードから読み取った値をどこに保存するかを知る必要があります。

int main(){
   char arrays[12];
   char *pointers= arrays;
   scanf("%s",pointers);
   printf("%s",pointers);
   return 0;
}
于 2013-01-27T09:35:48.467 に答える
10

初期化されていないメモリ内のアドレスに書き込んでいるためです。初期化されていないポインタによるメモリ ポインタへの書き込みは、未定義の動作を引き起こします。十分なメモリを割り当てます。

pointers = malloc(256);
if(!pointers)
  perror("malloc");
else
  scanf("%255s", pointers);

または、静的配列として宣言します。

char pointers[256];

また、scanf() の代わりにfgets()を使用することも検討してください。

fgets() に興味がある場合は、以下をお読みください。

scanf() と fgets() の違い

于 2013-01-27T09:19:13.953 に答える
5
  • char *pointers;ポインター変数を作成します。
  • pointersデフォルトでaddresspointers不定です。
  • *pointersが指すアドレスのデータであり、pointersアドレスが割り当てられるまで実行できません。

これを行うだけです。

char arrays[12];
char *pointers;
pointers = arrays;
scanf("%s",pointers);
于 2013-01-27T09:23:42.350 に答える
2

pointers単一化されたポインターです。あなたはそれに書き込むことができません。で行ったように、文字列を格納するのに十分なメモリを割り当てる必要がありarraysます。ポインターを使用すると、動的割り当てを使用できます (参照malloc)。

于 2013-01-27T09:19:14.897 に答える
2

pointersのように、初期化せずに使用されていますint x; printf("%d\n", x);。ポインターを使用する前に、何かを指すようにする必要があります。あなたはどの本を読んでいますか。

于 2013-01-27T09:20:05.720 に答える
1

エラーについて詳しく教えてください。私は現在コンパイラの周りにいません。

ただし、scanfとprintfを機能させるには、プログラムの上部にこれを配置する必要があります。

#include <stdio.h>
#include <stdlib.h>

どちらもCの標準ライブラリです。IOにはscanfが含まれていますが、printfも同じであると確信しています。しかし、どのライブラリがどの関数に必要かがわかるまでは、すべてのプログラムに両方の標準ライブラリを含めることは問題ありません。すべてのファイルに大量の#includeが必要ないように、カスタムヘッダーファイルも使用してみてください。

mallocメモリ割り当てのステートメントを忘れないでください。

しかし、コードで何をしようとしているのかわかりません。詳しく説明してください。

于 2013-01-27T09:29:43.740 に答える