为何无法打印声明时初始化的指针指向值?常量初始化指针崩溃是否非法?
指针初始化与解引用问题的详细解答
先直接看你的代码,咱们一步步拆解问题:
#include <stdio.h> int main() { int *i = (int *)1; printf("The value that i pointer points to is %d\n", *i); return 0; }
问题2:用常量1初始化指针的操作是否非法?
答案是完全非法,而且属于严重的错误操作。
指针的核心作用是存储有效的内存地址,这个地址必须指向一块你的程序有权限访问的内存区域(比如栈上的局部变量、堆上分配的内存,或者全局变量的内存)。你把1强制转换成int*,相当于让指针i指向了内存地址0x00000001(32位系统下的表示,64位下是0x0000000000000001),这个地址属于操作系统的内核保留内存区,用户态程序根本没有访问权限。当你尝试解引用这个指针(也就是*i)时,操作系统会直接触发内存访问错误,导致程序崩溃——这就像你拿着一把钥匙去开不属于你的保险柜,保安直接把你拦下来是一个道理。
问题1:为何无法打印指针指向的值?
根源就是上面说的:你的指针指向的是一个无效且不可访问的内存地址,解引用这种指针属于C语言里的「未定义行为」——程序的结果是完全不可控的,要么直接崩溃,要么输出一堆无意义的乱码,绝对不可能得到你预期的结果。
正确的指针使用方式
如果你想让指针指向值为1的内存,应该这么做:
- 指向栈上的局部变量:
#include <stdio.h> int main() { int val = 1; // 在栈上创建一个值为1的变量 int *i = &val; // 让指针指向这个变量的地址 printf("The value that i pointer points to is %d\n", *i); // 正常输出1 return 0; }
- 或者在堆上分配内存:
#include <stdio.h> #include <stdlib.h> int main() { int *i = malloc(sizeof(int)); // 在堆上分配一块int大小的内存 if (i != NULL) { // 一定要检查malloc是否成功 *i = 1; // 给这块内存赋值1 printf("The value that i pointer points to is %d\n", *i); // 正常输出1 free(i); // 记得释放堆内存 } return 0; }
内容的提问来源于stack exchange,提问作者s ange
相关产品推荐
相关产品推荐

