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

C语言中安全递增堆指针:偏移后指针重复释放是否合法?

这种操作完全不安全,属于未定义行为

你的代码存在两个触发未定义行为的严重问题:

  • 传入非原始指针调用free:free函数的规则很明确,只能传入malloc/calloc/realloc返回的原始指针,或者NULL。new_s = s+1是偏移后的指针,虽然指向同一块内存的内部,但内存分配器依赖原始指针定位内存块的元数据(比如块大小、管理标记等),偏移后的指针无法正确找到这些数据,调用free(new_s)会直接破坏堆结构,可能导致程序崩溃、内存泄漏,或是后续内存操作出现毫无征兆的异常。

  • 双重释放内存:就算new_s是原始指针,连续调用free(s)和free(new_s)也属于双重释放——同一块内存被释放了两次,这本身就是未定义行为,会损坏堆结构,引发各种难以调试的问题。

正确的处理方式

如果需要对内存区域做“切片”访问,只需要保留好malloc返回的原始指针,用偏移后的指针读取或修改内存即可,仅需释放一次原始指针。修正后的示例代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() {
    char *s = (char*)malloc(256);
    strcpy(s, "Hello");

    printf("%s\n", s); // Hello
    char *new_s = s+1;
    printf("%s\n", new_s); // ello

    // 仅释放原始指针一次
    free(s);

    return 0;
}

内容的提问来源于stack exchange,提问作者beep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:12:10