C 将变量分配给指针

C 将变量分配给指针,c,C,编译下面的代码时,程序似乎崩溃了。但是,编译过程中没有错误 ... int *x; *x = 3; printf("%d", *x); ... 据我所知,这个程序将指针*x声明为一个整数值,然后将值3分配给延迟的指针*x 那么为什么程序会崩溃呢?如果我这样做,程序可以正常工作 ... int *x, y; y = 3; x = &y; printf("%d", *x); ... 因此,跳过y变量,而将指针*x直接赋给整数值似乎有什么问题?问题在于,在第一种情况下,

编译下面的代码时,程序似乎崩溃了。但是,编译过程中没有错误

...
int *x;     
*x = 3;
printf("%d", *x);
...
据我所知,这个程序将指针
*x
声明为一个整数值,然后将值3分配给延迟的指针
*x

那么为什么程序会崩溃呢?如果我这样做,程序可以正常工作

...
int *x, y; 
y = 3;
x = &y;    
printf("%d", *x);
...

因此,跳过y变量,而将指针*x直接赋给整数值似乎有什么问题?

问题在于,在第一种情况下,指针“x”没有指向有效的内存位置。您正试图更改程序不拥有的未分配内存的值。
指针在使用之前必须始终正确初始化


据我所知,这个程序将指针*x初始化为 整数值,然后将值3指定给 延迟指针*x


这是不正确的<代码>整数*x声明一个int指针,但它不会将其初始化为任何值。此时,
x
指向什么是未知的,这取决于内存的当前状态。在取消引用指针之前,需要将其设置为指向某个对象(例如,
x=&y;
)。

在第一个示例中,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。

“此程序初始化指针
*x
”-否。
*x
不是指针
x
是指针,
*x
是取消引用该指针的结果。谢谢!这是否意味着我已经将整数3分配给了一个未分配的内存地址?嗯,这意味着你已经尝试将它分配给了一个未分配的地址。在这种情况发生之前,你应该得到一个分段错误;x=&z,即使根本不使用z,程序也可以运行。这就是将内存地址分配给指针*x(或初始化指针)的意思吗?@tys:yes,使用z。它是一个整数,因此有一个存储位置。。。你把这个存储位置的地址放在x里
int*x
只需为指针生成一个存储位置(但不是指针指向的内容…您必须自己做…例如,当您在这里使用
x=&z
)非常感谢您的知识,我现在对指针和地址的理解稍微好一点了(刚开始时我有点困惑)。非常感谢所有这些帮助。