2

私はこのコードを持っています:

#define ABC "abc"

void main()
{
char *s = malloc(sizeof(char)*3);
printf("%p ", s);
s = ABC;
printf("%p ", s);
free(s);
}

これは出力です:

0x8927008 0x8048574 Segmentation fault (core dumped)

ご覧のとおり、文字列 s のアドレスは割り当て後に変更されます (これが free() が segfault を与える理由だと思います)。なぜ、どのようにこれが起こるのか、誰かが私に説明できますか? ありがとうございました!

4

4 に答える 4

8

この線

s = ABC;

s読み取り専用メモリにある可能性のある別の文字列を指すように変更されます。このようなメモリを解放しようとすると、未定義の動作が発生します。クラッシュする可能性があります。

欲しかったと思います

strcpy(s, ABC);

代わりは。これにより、char 配列 "abc" が にコピーされsます。これによりさらにバグが発生することに注意してください -sは短すぎて、 の最後にヌル ターミネータのスペースがありませんABC。これを修正するには、割り当てを 4 バイトに変更します

char *s = malloc(4);

または使用

char *s = malloc(sizeof(ABC));

ifABCは保存する最大長です。

于 2012-11-22T11:28:39.160 に答える
3

void main() UB :mainリターンint

printf("%p", s) UB : スコープ内のプロトタイプなしで可変数の引数を受け入れる関数を呼び出します。UB : typeの値が期待されるchar*場所で type の値を使用しています。void*

free(s) UB : s は a の結果ではありませんmalloc()

UB未定義の動作です。

于 2012-11-22T11:30:15.617 に答える
0

次の行を変更します。char*s= malloc(sizeof(char)* 3);

char * s =(char *)malloc(sizeof(char)* 3);

これにより、多くのコンパイラが警告する警告がクリアされます。

それ以上に、何をするかに応じてコードをより柔軟にすることをお勧めします。なんらかの理由でABCを「ABCD」に変更すると、すべてのキャラクターに十分なスペースが割り当てられなくなります。

また、文字列「ABC」は実際には4文字です(文字列を終了する末尾にnullがあるため)。その余分なターミネータがないと問題が発生します。

于 2012-11-22T14:56:28.173 に答える