-1

重複の可能性:
malloc(0)のポイントは何ですか?

malloc(0)が実際に書き込み用の有効なポインターを返すのはなぜですか?

char *str = NULL;

str = (char*)malloc(0); // allocate 0 bytes ?

printf("Pointer of str: %p\n", str);

strcpy(str, "A very long string ...................");

printf("Value of str: %s", str);

free(str); // Causes crash if str is too long

出力:

Pointer of str: 0xa9d010
Aborted
Value of str: A very long string ...................

が短い場合strは、正常に機能します。

ところで:コンパイルには、「-D_FORTIY_SOURCE=0-fno-stack-protector」を指定してGCCを使用しました

*** glibc detected *** ..: free(): invalid next size (fast): 0x0000000000a9d010 ***
4

3 に答える 3

4

によって返されるポインタを逆参照することは未定義の動作malloc(0)です。

C標準から:

(C99、7.20.3p1) "要求されたスペースのサイズがゼロの場合、動作は実装で定義されます。nullポインターが返されるか、返されたポインターがゼロ以外の値であるかのように動作します。オブジェクトへのアクセスには使用しないでください。」

于 2013-01-23T18:53:54.773 に答える
2

なぜmalloc(0)実際に書き込み用の有効なポインタを返すのですか?

書き込み用の有効なポインタを返しません。使用しないための有効なポインタを返します。またはNULL、C標準ではこのケースが実装定義であると指定されているため、これも返される可能性があります。

于 2013-01-23T18:56:32.417 に答える
1

malloc()はvoid*ポインタを返すことになっています。そしてそれは忠実にそれを行います。ただし、逆参照するとUBになります。

于 2013-01-23T18:56:23.167 に答える