對於它的價值:
我無法弄清楚這一點我自己,所以我跟我的編譯器討論這一點,他說,條件是相當於*到if (_ptr != NULL)
:
%gcc -Wall -O2 -g -c convoluted.c; objdump的-d -M英特爾-S convoluted.o
convoluted.o: file format elf32-i386
Disassembly of section .text.startup:
00000000 <main>:
#include <stdlib.h>
int main(void)
{
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 e4 f0 and esp,0xfffffff0
6: 83 ec 10 sub esp,0x10
void* _ptr=malloc(1024);
9: c7 04 24 00 04 00 00 mov DWORD PTR [esp],0x400
10: e8 fc ff ff ff call 11 <main+0x11>
if(*((void **) &(_ptr)) != (void *) NULL)
15: 85 c0 test eax,eax
17: 74 08 je 21 <main+0x21>
{
free(_ptr);
19: 89 04 24 mov DWORD PTR [esp],eax
1c: e8 fc ff ff ff call 1d <main+0x1d>
}
return 0;
}
21: 31 c0 xor eax,eax
23: c9 leave
24: c3 ret
%的gcc -Wall -O2 -g -c kindanormal.c; objdump的-d -M英特爾-S kindanormal.o
kindanormal.o: file format elf32-i386
Disassembly of section .text.startup:
00000000 <main>:
#include <stdlib.h>
int main(void)
{
0: 55 push ebp
1: 89 e5 mov ebp,esp
3: 83 e4 f0 and esp,0xfffffff0
6: 83 ec 10 sub esp,0x10
void* _ptr=malloc(1024);
9: c7 04 24 00 04 00 00 mov DWORD PTR [esp],0x400
10: e8 fc ff ff ff call 11 <main+0x11>
if(_ptr != NULL)
15: 85 c0 test eax,eax
17: 74 08 je 21 <main+0x21>
{
free(_ptr);
19: 89 04 24 mov DWORD PTR [esp],eax
1c: e8 fc ff ff ff call 1d <main+0x1d>
}
return 0;
}
21: 31 c0 xor eax,eax
23: c9 leave
24: c3 ret
注意 檢查本身是不是真的有必要要麼,其他人指出。更自然的方法是:
free(_ptr); _ptr = NULL;
*在這個機器上,在此係統中,這GCC版本和CPU,只有當星星在剛剛正確的方式對齊......
來源
2013-06-04 09:48:54
djf
你是不是指'if(_ptr!= NULL)'? – szx
看起來像一個混淆的C編程競賽中的一行 – djf
這也是不必要的;在指針上調用'free'之前,不需要檢查NULL。 –