次のコードスニペットの出力とその理由は何ですか?
char * ptr;
if((ptr =(char *)malloc(0))== NULL)
puts( "Gota nullポインタ");
else
puts( "Gota有効なポインタ");
最初に大胆な推測を行うことができます。次に、
コンパイラが次のコンパイルを試みます〜〜
手順は以下のとおりです。
#include <stdio.h>
#include <malloc.h>
int main()
{
char *ptr;
if((ptr = (char *)malloc(0)) == NULL)
puts("got a null pointer\n");
else
puts("got a valid pointer\n");
int a = malloc_usable_size(ptr);
printf("size = %d\n", a);
return 0;
}
Mallocは長さが0のスペースに適用され、mallocは引き続きアドレスを返し、アドレススペースが残っているため、ptrはNULLに等しくありません。
malloc関数にはしきい値があります。このしきい値よりも小さいスペースを申請すると、このしきい値サイズのスペースが返されます。
しきい値が24の場合、24未満の値を適用すると、24が返されます。
結果を次
の図に示します。このしきい値はコンパイラによって異なります。たとえば
、Ingenic mips-linux-gnu- gccをコンパイルすると、実行結果は次のようになります。
下の図に示すように、負の数を申請すると、戻り値は0になります。
これは、mallocで負の数を申請できないと規定されているためです。