在C中初始化指针的不同方法

时间:2015-04-09 13:42:00

标签: c

1

int *a;
*a=5;
printf("%d",*a);

为什么这一个没有给出任何输出,最终返回大值?

2

int *a,b=1;
a=&b;
*a=5;
printf("%d",*a);

为什么这个效果很好并且输出为5?

3 个答案:

答案 0 :(得分:3)

在第一个代码段中

int *a;

a是一个指针,并没有指向任何有效的内存位置,你取消引用将导致未定义行为的指针。

第二个代码段是好的和有效的 你有一个指向变量b的指针并解除它。

a = &b; 
*a = 5;

现在指针指向变量b的地址,并且您更改了定义的位置的内容

答案 1 :(得分:1)

在第一个片段中,指针a未初始化,语句*a = 5;正在将5写入未分配的位置。如果此语句修改的位置属于该程序,则它可能表现不正常。如果它属于操作系统,程序很可能会崩溃。行为未定义。

答案 2 :(得分:0)

aint*,指向int的指针。在第一个代码段中,您认为a指向哪里?答案是a指向某些随机位置。使用

*a=5;

取消引用指针并将5写入无效的内存位置。这会调用未定义的行为,任何事情都可能发生。如果幸运的话,最终可能会出现 Segmentation Fault

在第二个代码段中,b是一个int,一个整数变量。它的内存由堆栈上的OS提供。您将a指向变量b的地址。然后,取消引用指针并将5写入该位置是有效的,因为内存是为变量b分配的。