解决C程序单次运行多文件创建时的内存访问违规Bug
问题定位与修复方案
核心原因分析
0xC0000005内存访问违规触发在(*fileArray)[*size] = _strdup(fileName);行,本质是字符串数组的内存管理错误:要么数组未正确扩容,要么size与数组容量不匹配,导致访问了未分配的内存区域。
具体修复步骤
1. 引入容量变量管理数组边界
必须同时跟踪数组的当前元素数(size)和已分配的容量(capacity),避免越界访问。初始化示例:
int size = 0; int capacity = 2; // 初始分配可存储2个文件名的空间 char** fileArray = malloc(capacity * sizeof(char*)); if (fileArray == NULL) { perror("malloc failed"); exit(1); }
2. 添加元素前检查容量并按需扩容
在执行赋值操作前,先判断是否需要扩容,确保数组有足够空间存储新元素:
if (*size >= *capacity) { // 扩容为原容量的2倍,减少频繁内存分配开销 int newCapacity = *capacity * 2; char** tempArray = realloc(*fileArray, newCapacity * sizeof(char*)); if (tempArray == NULL) { perror("realloc failed"); // 内存分配失败时,先释放已分配的字符串和数组,避免泄漏 for (int i = 0; i < *size; i++) { free((*fileArray)[i]); } free(*fileArray); exit(1); } *fileArray = tempArray; *capacity = newCapacity; } // 此时可安全添加新元素 (*fileArray)[*size] = _strdup(fileName); (*size)++;
3. 修正数组初始化与索引加载逻辑
- 确保程序启动时
fileArray已完成初始内存分配,而非NULL。 - 若从
index_data.txt加载已有索引,加载完成后需同步更新size和capacity:比如加载了3个文件名,capacity至少设为3(或更大值,如4),避免后续添加直接越界。
4. 验证size变量的更新时机
创建第一个文件后,必须确认size已正确递增(比如从0变为1),确保第二次添加时访问的是数组的有效索引位置。
5. VS环境下的调试技巧
- 使用VS的内存窗口查看
fileArray的内存布局,检查扩容后的内存地址是否有效、是否有足够空间存储新指针。 - 给
size、capacity、fileArray添加监视,观察每次操作时变量的变化,排查是否出现size > capacity的情况。
额外注意事项
- 程序退出前,需遍历
fileArray释放每个_strdup分配的字符串内存,再释放fileArray本身,避免内存泄漏。 - 若需跨平台兼容性,可替换微软特定的
_strdup为标准C实现:
char* dupName = malloc(strlen(fileName) + 1); if (dupName == NULL) { perror("malloc for filename failed"); // 处理分配失败逻辑 } strcpy(dupName, fileName); (*fileArray)[*size] = dupName;
内容的提问来源于stack exchange,提问作者Anon26
相关产品推荐
相关产品推荐

