1
int *a;
*a=5;
printf("%d",*a);
为什么这一个没有给出任何输出,最终返回大值?
2
int *a,b=1;
a=&b;
*a=5;
printf("%d",*a);
为什么这个效果很好并且输出为5?
答案 0 :(得分:3)
在第一个代码段中
int *a;
a
是一个指针,并没有指向任何有效的内存位置,你取消引用将导致未定义行为的指针。
第二个代码段是好的和有效的
你有一个指向变量b
的指针并解除它。
a = &b;
*a = 5;
现在指针指向变量b
的地址,并且您更改了定义的位置的内容
答案 1 :(得分:1)
在第一个片段中,指针a
未初始化,语句*a = 5;
正在将5
写入未分配的位置。如果此语句修改的位置属于该程序,则它可能表现不正常。如果它属于操作系统,程序很可能会崩溃。行为未定义。
答案 2 :(得分:0)
a
是int*
,指向int
的指针。在第一个代码段中,您认为a
指向哪里?答案是a
指向某些随机位置。使用
*a=5;
取消引用指针并将5写入无效的内存位置。这会调用未定义的行为,任何事情都可能发生。如果幸运的话,最终可能会出现 Segmentation Fault 。
在第二个代码段中,b
是一个int
,一个整数变量。它的内存由堆栈上的OS提供。您将a
指向变量b
的地址。然后,取消引用指针并将5写入该位置是有效的,因为内存是为变量b
分配的。