C语言中如何为字符指针数组分配内存?读取文件遇段错误求助
解决你的字符指针数组构建与段错误问题
别担心,新手写C代码遇到段错误太正常了!咱们一步步拆解你的代码问题,再给你修正后的实现:
你的代码里的关键错误
realloc的尺寸计算完全错误
你写的sizeof(char*)+sizeof(mazestring)完全不符合指针数组扩容的逻辑:sizeof(mazestring)是指针本身的大小(64位系统下是8字节),这根本不是数组元素的数量。要维护指针数组,你需要跟踪当前数组的元素个数,每次扩容应该分配(当前元素数 + 1) * sizeof(char*)的空间,这样才能容纳新的char*元素。没有把新分配的
cp存入数组
你每次malloc出cp后,从来没把它放到mazestring的对应位置里——数组里的元素都是未初始化的野指针,这直接会触发段错误,还会造成内存泄漏。char c的类型错误fgetc返回的是int类型:它需要能返回所有char的取值(0-255)加上EOF(一个负数,通常是-1)。如果你的char是无符号类型,c永远不会等于EOF,循环会无限执行,最终内存耗尽导致崩溃。单个字符的内存分配冗余
你用malloc(sizeof(char*))来存一个char,这完全没必要——sizeof(char*)是指针大小(8字节),但你只需要1字节存储单个char,应该用malloc(sizeof(char))。
修正后的代码实现
#include <stdio.h> #include <stdlib.h> int main() { FILE *in_file = fopen("your_file.txt", "r"); if (!in_file) { perror("Failed to open file"); return 1; } int c; // 用int存储fgetc的返回值,正确识别EOF char** mazestring = NULL; size_t count = 0; // 跟踪指针数组的元素个数 while ((c = fgetc(in_file)) != EOF) { // 扩容指针数组:先存临时指针,避免realloc失败丢失原有数据 char** temp = realloc(mazestring, (count + 1) * sizeof(char*)); if (!temp) { perror("Failed to realloc mazestring"); // 内存分配失败时,清理已分配的内存避免泄漏 for (size_t i = 0; i < count; i++) { free(mazestring[i]); } free(mazestring); fclose(in_file); return 1; } mazestring = temp; // 分配单个字符的存储空间 char *cp = malloc(sizeof(char)); if (!cp) { perror("Failed to malloc cp"); // 同样清理已分配内存 for (size_t i = 0; i < count; i++) { free(mazestring[i]); } free(mazestring); fclose(in_file); return 1; } *cp = (char)c; mazestring[count++] = cp; // 将新字符指针存入数组,计数+1 } // 示例:遍历打印所有字符 for (size_t i = 0; i < count; i++) { printf("%c", *mazestring[i]); free(mazestring[i]); // 释放单个字符的内存 } free(mazestring); // 释放指针数组本身 fclose(in_file); return 0; }
额外说明
- 加入了内存分配错误检查:C里内存分配可能失败,必须检查返回值,否则会出现未知崩溃。
- 用
size_t计数:这是C标准中专门用来表示大小/数量的无符号类型,比int更合适。 realloc用临时指针:如果realloc失败会返回NULL,直接赋值会丢失原来的指针,导致内存泄漏。- 最后记得释放所有分配的内存:避免程序退出后残留内存泄漏。
如果你其实是想把文件的每一行作为字符串存入指针数组(而不是每个字符一个指针),可以再调整逻辑~
内容的提问来源于stack exchange,提问作者Adam G.
相关产品推荐
相关产品推荐

