使用*(p+1)为内存下一个地址赋值20并打印却无输出的原因排查
问题根源:非法内存访问导致的未定义行为
你的代码之所以没有输出,核心是触发了未定义行为(Undefined Behavior)——说白了就是你往一块不属于你程序的内存里写了数据,直接打乱了程序的正常运行逻辑,甚至可能被操作系统直接终止进程。
咱们一步一步拆解问题:
- 你只声明了单个
int变量a,它在内存中只占用一个int大小的空间,没有多余的连续内存可供使用。 - 指针
p指向a的地址后,p+1会跳到a之后的下一个int大小的地址,但这个地址根本没被你的程序合法分配——既不是其他变量的地址,也不是你用malloc申请的堆内存。 - 当你执行
*(p+1) = 20时,相当于在"别人的地盘"乱改数据,这可能破坏栈上的函数返回地址、printf的输出缓冲区,甚至直接让操作系统强制终止你的程序,导致printf的内容还没来得及显示到控制台,程序就挂了。
正确验证指针运算的方式
如果想测试指针+1的效果,得用合法的连续内存,比如数组或者堆内存:
方案1:用数组(最简单)
数组在内存中是连续存储的,指针+1正好指向数组的下一个元素,完全合法:
#include <stdio.h> #include <stdlib.h> int main(void) { int arr[2] = {10}; // 申请两个连续的int空间,第一个元素初始化为10 int *p = arr; *(p+1) = 20; // 这里p+1就是arr[1]的地址,赋值完全合法 printf("The value at (p+1) is %d\n",*(p+1)); return 0; }
方案2:用堆内存(适合动态分配场景)
如果需要动态调整内存大小,可以用malloc申请堆内存,记得用完要释放:
#include <stdio.h> #include <stdlib.h> int main(void) { // 申请两个int大小的堆内存空间 int *p = malloc(2 * sizeof(int)); if (p == NULL) { // 一定要检查malloc是否成功,避免空指针问题 perror("malloc failed"); return 1; } *p = 10; // 给第一个int赋值 *(p+1) = 20; // 给第二个int赋值,合法操作 printf("The value at (p+1) is %d\n",*(p+1)); free(p); // 释放堆内存,避免内存泄漏 return 0; }
补充说明
有些情况下,你可能在printf后面加个fflush(stdout);能看到输出,但这只是运气好——非法内存访问的结果是完全不可预测的,这次能输出,下次可能直接崩溃,绝对不能靠这种方式解决问题。
内容的提问来源于stack exchange,提问作者Satya
相关产品推荐
相关产品推荐

