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

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;
}

额外说明

  1. 加入了内存分配错误检查:C里内存分配可能失败,必须检查返回值,否则会出现未知崩溃。
  2. 用size_t计数:这是C标准中专门用来表示大小/数量的无符号类型,比int更合适。
  3. realloc用临时指针:如果realloc失败会返回NULL,直接赋值会丢失原来的指针,导致内存泄漏。
  4. 最后记得释放所有分配的内存:避免程序退出后残留内存泄漏。

如果你其实是想把文件的每一行作为字符串存入指针数组(而不是每个字符一个指针),可以再调整逻辑~

内容的提问来源于stack exchange,提问作者Adam G.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:05:13