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

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:37:12