编译时,程序似乎崩溃了。但是,编译过程中没有错误。
...
int *x;
*x = 3;
printf("%d", *x);
...
据我所知,该程序将指针*x
声明为整数值,然后将值3赋给指向引用的*x
。
那为什么程序会崩溃?如果我这样做,程序可以正常工作。
...
int *x, y;
y = 3;
x = &y;
printf("%d", *x);
...
那么,跳过y变量似乎是什么问题,而是将指针* x直接赋值为整数值?
答案 0 :(得分:3)
据我所知,该程序将指针* x初始化为a 整数值,然后将值3赋值给 引用指针* x。
这是不正确的。 int *x;
声明了一个int指针,但它没有将它初始化为任何。此时x
指向的内容未知,取决于当前的内存状态。在取消引用指针之前,您需要将其设置为指向某个内容(例如,x = &y;
)。
答案 1 :(得分:2)
问题是在第一种情况下,指针'x'没有指向有效的内存位置。并且您正在尝试更改程序不拥有的未分配内存的值 指针在使用前必须始终正确初始化。
答案 2 :(得分:2)
在第一个例子中,x未初始化,因此没有指向有效的内存。
您可以将代码更改为
int *x = malloc(sizeof(int));
*x = 3;
printf("%d", *x);
它会起作用。
在你的第二个例子中
int *x, y;
您将x指定为指针,y指定为普通的int变量,而不是另一个指针。如果你想要2个指针,那么语法就是。
int *x, *y;
这可能令人困惑,也是一些C程序员从不在一行上声明多个变量的部分原因。
x = &y;
在这里,您将y的地址分配给x,从而使x指向有效内存,通过解除引用指针的后续分配将起作用。
你会发现,如果你打印了y的值,那么当你通过x改变它时它也会是3。