私は最近、いくつかの C プログラミングを試みましたが、次の問題に出くわしました。MinGW 32 ビットで NetBeans 7.4 64 IDE を使用しています。これは私の問題を強調する短いコード例です:
int main(void) {
unsigned short int temp;
char *pointer;
pointer = malloc(12 * sizeof(char));
printf("The pointers value is %d \n", (int)pointer);
printf("Type a short string:\n");
gets(pointer);
printf("The pointers value is %d \n", (int)pointer);
printf("Type an int: \n");
//This line changes the char pointer to an apparently random value
scanf("%d", &temp);
//Segmentation fault upon this point
printf("The pointers value is %d \n", (int)pointer);
//And here as well
free(pointer);
return (EXIT_SUCCESS);
}
scanf まではすべて問題ありません。gets によって読み取られた文字列は、ポインタが指しているメモリ空間に書き込まれます。しかし、scanf が処理された後、ポインターの値が変更され、ポインターが任意のスペースを指すようになります。したがって、文字列が失われるだけでなく、プログラムに属していないメモリにアクセス/解放しようとすると、セグメンテーション違反も発生します。
値の変化は明らかにランダムです。このプログラムをデバッグするたびに、ポインターが別の値に変更されます。
unsigned short int に問題があるか、scanf のフォーマット指定子 (%hu ではなく %d) が間違っていると既に推測しています。unsigned short int を int に変更するか、指定子として %hu を使用すると、すべて正常に動作します。そこで解決策です。
しかし、この間違いによってポインタが影響を受ける理由と方法については、まだ興味があります。誰でも私を助けることができますか?