动态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
相关产品推荐
相关产品推荐

