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

malloc分配内存在独立函数执行后不可访问的技术问题求助

问题根源分析与修复方案

我来帮你拆解下这个问题的核心原因——堆内存越界访问,这直接导致了后续内存操作出现异常,就是你看到的table[4]值被篡改、调试器提示无法访问指定内存的情况。

核心错误:指针数组的内存分配错误

你的代码里table是char **类型,本质是一个指针数组(每个元素都是指向字符串的指针)。但在main函数里你写了:

table = malloc(10);

这只分配了10个字节的空间,而在64位系统中,每个指针需要占用8字节。也就是说,10字节最多只能放下1个完整的指针,剩下的2字节完全不够存储第二个指针。当你循环给table[1]、table[2]……赋值时,完全是在越界写入堆内存,这会破坏堆的管理结构、覆盖相邻的内存数据,进而引发各种诡异的内存异常(比如你遇到的table[4]值莫名变化、内存访问错误)。

正确的写法应该是为指针数组分配足够的指针空间:

table = malloc(10 * sizeof(char*));

这样才是分配了能容纳10个char*指针的内存,足够你循环7次(i=0到i=6)的使用需求。

其他优化与注意事项

除了核心的内存分配错误,还有几个细节可以帮你避免后续问题:

  • 永远检查malloc的返回值:内存分配可能失败,返回空指针,直接访问会导致崩溃。
  • 处理fgets的返回值:如果输入提前结束,fgets会返回NULL,后续操作会出问题。
  • 记得释放动态内存:避免内存泄漏,这在长期运行的程序里很重要。

修复后的完整代码

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

char **table;

int change() {
    char s[1025];
    for(int i = 0; i <= 6; i++) {
        // 检查fgets是否成功读取
        if(fgets(s, 1024, stdin) == NULL) {
            fprintf(stderr, "Failed to read line %d\n", i+1);
            break;
        }
        // 分配字符串内存并检查是否成功
        table[i] = malloc(strlen(s) + 1);
        if(table[i] == NULL) {
            perror("malloc for string failed");
            return -1;
        }
        strcpy(table[i], s);
        
        // 可选:去掉fgets读取的换行符
        s[strcspn(s, "\n")] = '\0';
    }
    return 0;
}

int main() {
    // 正确分配指针数组的内存
    table = malloc(10 * sizeof(char*));
    if(table == NULL) {
        perror("malloc for table failed");
        return 1;
    }
    
    change();
    
    // 释放所有动态分配的内存
    for(int i = 0; i <= 6; i++) {
        if(table[i] != NULL) {
            free(table[i]);
        }
    }
    free(table);
    return 0;
}

修复后再运行调试,你遇到的table[4]值异常、内存访问错误的问题应该就完全消失了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:57:49