C语言 分配给未初始化的整数指针

ecr0jaav  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(192)

在下面的代码片段中,由于指针没有初始化,值2是如何存储的?

int *p;
*p = 2;
printf("%d %d\n",p,*p);

上述程序的输出如下:

0 2

我正在阅读Peter林登的《C语言编程Maven》,发现了这个:

float *pip = 3.141; /* Wont compile */

但是上面的程序是如何给出输出的呢?是因为使用了GCC吗?还是我遗漏了什么?

编辑

我理解为什么float *pip = 3.141是无效的,因为地址位置必须是整数。那么这是否意味着p存储内存地址'0',并且'2'的值被分配给这个地址?为什么在这种情况下没有分段错误?

wpcxdonn

wpcxdonn1#

float *pip = 3.141;

pip是一个指针,指针必须用地址初始化(而不是值)
例如:

float f[] = {0.1f, 0.2f, 3.14f};
float *pip = &f[2];
printf("%f\n", *pip);

编辑:
另一个:

int *p = malloc(sizeof(int)); /* allocates space */
*p = 2; /* Now you can use it */
printf("%p %d\n", (void *)p, *p);
free(p);
ozxc1zmp

ozxc1zmp2#

这条线

float* pip = 3.141

可以被重写

float* pip;
pip = 3.141;

看到区别了吗?比较一下:

int* p;
*p = 2;

在前一种情况下,您试图将3.141分配为 * 内存地址 *,而在后一种情况下,您(有效地)将2作为 * 值 * 分配给 * 解引用 * 内存地址。

相关问题