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

