|
60鱼币
本帖最后由 孤不冷cing 于 2022-11-26 19:14 编辑
看了大佬们的回复,感觉自己C的门还没摸到,任重而道远啊
- $ cat test3.c
- #include <stdio.h>
- struct Imfor{
- char *name;
- };
- int main(void)
- {
- struct Imfor imfor;
- if (imfor.name == NULL)
- printf("imfor.name == NULL\n");
- return 0;
- }
- $ gcc test3.c -o test3 && ./test3
- imfor.name == NULL
复制代码
- $ cat test4.c
- #include <stdio.h>
- struct Imfor{
- char name[10];
- };
- int main(void)
- {
- struct Imfor imfor;
- if (imfor.name == NULL)
- {
- printf("imfor.name == NULL\n");
- }
- else if (imfor.name[0] == '\0')
- {
- printf("imfor.name[0] == '\\0'\n");
- }
- return 0;
- }
- $ gcc test4.c -o test4 && ./test4
- imfor.name[0] == '\0'
复制代码
在小甲鱼的C教程里说,未初始化的会自动初始化为'\0',为什么字符指针是初始化为NULL啊
结构体中其他类型的变量又会初始化成什么呢
本帖最后由 jackz007 于 2022-11-26 10:56 编辑
分别用 gcc 和 VC9.0 编译下面的代码,研究一下反汇编代码,看看是否真的有变量的初始化
- #include <stdio.h>
- int main(void)
- {
- struct node {
- int i ;
- int * p ;
- } dx ;
- printf("i = %d\n" , dx . i) ;
- printf("p = %p\n" , dx . p) ;
- }
复制代码
【tdm-gcc 5.1.0】:
- 00401350 /$ 55 push ebp main() 入口
- 00401351 |. 89E5 mov ebp, esp
- 00401353 |. 83E4 F0 and esp, FFFFFFF0
- 00401356 |. 83EC 20 sub esp, 20 <--- 堆栈分配 0x20 字节供局部变量使用
- 00401359 |. E8 E2050000 call 00401940
- 0040135E |. 8B4424 18 mov eax, dword ptr [esp+18] <--- dx . i - 直接使用,未经任何初始化
- 00401362 |. 894424 04 mov dword ptr [esp+4], eax <--- dx . i 入栈,准备显示
- 00401366 |. C70424 24304000 mov dword ptr [esp], 00403024 ; ||ASCII "i = %d"
- 0040136D |. E8 3E080000 call <jmp.&msvcrt.printf> ; |\printf()
- 00401372 |. 8B4424 1C mov eax, dword ptr [esp+1C] <--- dx . p - 直接使用,未经任何初始化
- 00401376 |. 894424 04 mov dword ptr [esp+4], eax <--- dx . p 入栈,准备显示
- 0040137A |. C70424 2C304000 mov dword ptr [esp], 0040302C ; |ASCII "p = %p"
- 00401381 |. E8 2A080000 call <jmp.&msvcrt.printf> ; \printf()
- 00401386 |. B8 00000000 mov eax, 0
- 0040138B |. C9 leave
- 0040138C \. C3 retn
复制代码
【VC9.0】
- 00401000 /$ 55 push ebp main() 入口
- 00401001 |. 8BEC mov ebp, esp
- 00401003 |. 83EC 08 sub esp, 8 <--- 堆栈分配 0x08 字节供局部变量使用
- 00401006 |. 8B45 F8 mov eax, dword ptr [ebp-8] dx . i - 直接使用,未经任何初始化
- 00401009 |. 50 push eax <--- dx . i 入栈,准备显示
- 0040100A |. 68 00C04000 push 0040C000 ; ASCII "i = %d"
- 0040100F |. E8 1A000000 call 0040102E <--- printf()
- 00401014 |. 83C4 08 add esp, 8
- 00401017 |. 8B4D FC mov ecx, dword ptr [ebp-4] <--- dx . p - 直接使用,未经任何初始化
- 0040101A |. 51 push ecx <--- dx . p 入栈,准备显示
- 0040101B |. 68 08C04000 push 0040C008 ; ASCII "p = %p"
- 00401020 |. E8 09000000 call 0040102E <--- printf()
- 00401025 |. 83C4 08 add esp, 8
- 00401028 |. 33C0 xor eax, eax
- 0040102A |. 8BE5 mov esp, ebp
- 0040102C |. 5D pop ebp
- 0040102D \. C3 retn
复制代码
最后结论就是,不要想太多,编译器绝对不会为你初始化任何一个变量
|
最佳答案
查看完整内容
分别用 gcc 和 VC9.0 编译下面的代码,研究一下反汇编代码,看看是否真的有变量的初始化
【tdm-gcc 5.1.0】:
【VC9.0】
最后结论就是,不要想太多,编译器绝对不会为你初始化任何一个变量
|