我用一个常量初始化了指针,我知道它的地址将被传递给指针。因此,当我尝试测试常量是否可以打印时,程序崩溃了。那是非法的吗?
#include <stdio.h>
int main()
{
int *i = (int *)1;
printf("The value that i pointer points to is %d\n", *i);
return 0;
}
答案 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);