为什么在声明指针时不能打印已初始化的指针值?

时间:2019-05-09 12:16:33

标签: c

我用一个常量初始化了指针,我知道它的地址将被传递给指针。因此,当我尝试测试常量是否可以打印时,程序崩溃了。那是非法的吗?

#include <stdio.h>

int main()
{
   int *i = (int *)1;

    printf("The value that i pointer points to is %d\n", *i);

    return 0;
}

3 个答案:

答案 0 :(得分:5)

(int *)1;不是指向值1的指针,而是指向1号存储单元的指针。

#include <stdio.h>

int main()
{
   int n=1;
   int *i = &n;

    printf("The value that i pointer points to is %d\n", *i);

    return 0;
}

答案 1 :(得分:5)

您似乎认为(int *)1产生了存储值1的地址。不会。

当使用诸如(int *)之类的类型转换将整数转换为指针时,结果通常是将该值转换为地址。 1

因此int *i = (int *)1;i设置为指向地址1。然后,当尝试打印*i时,由于1不是有效的内存地址,程序崩溃了。 (通常,不对内存的第一页进行映射,以便对空指针的不正确使用将崩溃并显示问题,而不是允许程序继续使用不正确的数据执行操作。)

要设置i指向值为1的int,必须将其设置为值为1的int对象的地址。是:

int n = 1;
int *i = &n;

您还可以使用复合文字来创建值为1的未命名int

int *i = & (int) { 1 };

(int) { 1 }创建一个值为1的复合文字,&为其地址,然后将i初始化为该地址。

脚注

1 根据C标准,结果是实现定义的。因此,编译器可以定义所需的任何结果。但是,我见过的每个C编译器都会以一种或多种方式将整数值转换为地址。结果地址不一定有效,不能用于访问对象。

答案 2 :(得分:3)

printf("The value that i pointer points to is %d\n", *i);

您尝试取消对指针i的引用,但是它的值(指针的值)是某个值,您可以自行设置。您可以保证地址0x0001是您拥有的整数吗?使用此类指针您所能做的就是打印它的指针值(而不是它指向的值):

printf("The value of pointer i is %p\n", i);