为什么C语言中直接赋值整数的指针无法用printf输出对应值?
问题核心原因
你遇到的问题本质是指针变量的赋值逻辑错误,指针变量本身存储的是「内存地址」,只有给它赋值合法的、你拥有访问权限的内存地址,后续解引用操作才是合法的。
第一段代码逻辑合法的原因
int main() { int x = 7; int *aptr = &x; // 这里用&x取变量x对应的内存地址,赋值给指针aptr printf("%d",*aptr); // 解引用aptr,等价于访问x变量的值 *aptr = 21; // 解引用aptr后赋值,等价于修改x变量的值 printf("%d",*aptr); }
- 这里
aptr存储的是局部变量x的合法栈内存地址,你对这块内存有读写权限,所以读写操作都能正常执行。
第二段代码崩溃无输出的原因
int main() { int x = 7; int *aptr = 21; // 错误操作:直接把整数21当成内存地址赋值给指针 printf("%d",*aptr); // 尝试访问地址为21的内存,触发非法访问错误 }
- 数值21对应的内存地址(0x00000015)属于操作系统保护的低地址空间,普通用户程序没有权限访问这块内存。
- 当你执行
*aptr解引用操作时,操作系统会直接触发段错误(Segmentation Fault)终止程序运行,所以不会有任何输出内容。 - 额外提示:这段代码编译时编译器会抛出「整数转换为指针无类型强制转换」的警告,开发时注意不要忽略这类编译告警。
内容的提问来源于stack exchange,提问作者user17491290
相关产品推荐
相关产品推荐

