You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用*(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 10:18:17