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

动态char指针数组触发heap corruption detected错误的技术咨询

解决堆损坏(Heap Corruption Detected)问题的根源

嘿,这问题其实挺典型的——你在给指针数组分配内存的时候踩了个小坑!咱们来一步步拆解:

问题出在哪?

你声明的pArr是char**类型,也就是一个存储char指针的数组。但你给它分配空间的时候写的是:

pArr = (char**)malloc(sizeof(char) * 1);

这里错把char的大小当成了数组元素的大小!要知道,数组里的每个元素是char*(指针),它的大小在32位系统是4字节,64位是8字节,远大于char的1字节。这么小的空间根本装不下一个指针,后续给*pArr赋值的时候必然会越界写入,直接触发堆损坏检测。

修正后的代码

把分配指针数组的那行改成下面这样就行,顺便补上正确的内存释放顺序(避免内存泄漏):

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

int main(void) { 
    char** pArr = 0; 
    char string[] = "hello"; 

    // 正确:按char*的大小分配数组空间,用sizeof(*pArr)更通用
    pArr = malloc(sizeof(*pArr) * 1); 
    if (pArr == NULL) { // 最好加上内存分配失败的判断
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 这部分是对的:给第一个指针分配字符串空间
    *pArr = malloc(sizeof(char) * (strlen(string) + 1)); 
    if (*pArr == NULL) {
        free(pArr); // 分配失败要先释放已分配的内存
        printf("Memory allocation failed!\n");
        return 1;
    }

    strcpy(*pArr, string); 
    printf("%s\n", *pArr); // 可以直接打印字符串,更直观
    printf("pArr address: %p\n", pArr);

    // 释放顺序:先释放子指针,再释放数组指针
    free(*pArr);
    free(pArr); 

    getchar(); 
    return 0; 
}

额外建议

  • 用sizeof(*pArr)代替sizeof(char*)会更安全,哪怕以后把pArr的类型改成其他指针数组,这行代码也不用改。
  • 一定要检查malloc的返回值,避免空指针操作。
  • 释放内存要遵循“先分配的后释放”的原则,先释放*pArr指向的字符串空间,再释放pArr指向的指针数组空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:12:45