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

C语言中如何正确从自定义函数返回二维数组到主函数

问题原因

你当前代码无法正确返回单词数组的核心问题有4个:

  • 函数内部定义的char **arr[1000][30]是栈上分配的局部变量,函数执行结束后栈内存会被系统自动回收,直接返回这块内存的地址会成为野指针,访问就会出错。
  • 类型定义完全混乱:你声明函数返回值是char**,但arr实际是三维指针类型,最后return **arr返回的是单个char类型值,和声明的返回值、main函数里的接收变量类型全不匹配。
  • 没有提前为存储单词、存储字符分配合法内存,直接对未初始化的指针解引用赋值会触发内存访问错误。
  • main函数里同时定义了同名的array,一个是三维指针数组,一个是单字符变量,本身就存在语法冲突,根本无法接收返回的单词列表。
修正方案

采用动态堆内存分配实现单词存储和返回,堆内存不会随函数退出自动释放,可以安全在main函数中访问,使用完后手动释放即可。修正后的可运行代码如下:

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

#define MAX_WORDS 1000  // 最大支持单词数
#define MAX_WORD_LEN 30 // 单个单词最大长度

char** splitWords(int* word_total) {
    FILE *inp;
    // 动态分配存储单词指针的数组,类型为char**,每个元素指向一个单词字符串
    char** word_arr = (char**)malloc(MAX_WORDS * sizeof(char*));
    if (!word_arr) {
        perror("内存分配失败");
        exit(1);
    }
    // 给第一个单词预分配存储字符的内存
    word_arr[0] = (char*)malloc(MAX_WORD_LEN * sizeof(char));
    if (!word_arr[0]) {
        perror("内存分配失败");
        exit(1);
    }

    int word_count = 0;
    char c;
    int char_count = 0;

    inp = fopen("C:\\Users\\ksmcn\\Desktop\\free.txt", "r");
    if (!inp) {
        perror("文件打开失败");
        exit(1);
    }
    
    while ((c = fgetc(inp)) != EOF) {
        if (c == ' ' || c == '\n') {
            if (char_count == 0) continue; // 跳过连续空格、换行产生的空内容
            word_arr[word_count][char_count] = '\0'; // 给当前单词补字符串结束符
            word_count++;
            // 给下一个单词分配存储内存
            word_arr[word_count] = (char*)malloc(MAX_WORD_LEN * sizeof(char));
            if (!word_arr[word_count]) {
                perror("内存分配失败");
                exit(1);
            }
            char_count = 0;
        }
        else {
            word_arr[word_count][char_count] = c; 
            if (char_count < MAX_WORD_LEN - 1) // 预留1位存字符串结束符
                char_count++;
            else
                char_count = 0;
        }   
    }
    // 处理文件末尾没有空格/换行时,最后一个单词的收尾
    if (char_count > 0) {
        word_arr[word_count][char_count] = '\0';
        word_count++;
    }
    fclose(inp);
    *word_total = word_count; // 通过输出参数把实际读到的单词总数传回main
    return word_arr;
}

int main(int argc, char *argv[]) {
    int word_count = 0;
    char** word_array = splitWords(&word_count);
   
    // 测试:打印所有读取到的单词
    for (int i = 0; i < word_count; i++) {
        printf("第%d个单词:%s\n", i+1, word_array[i]);
    }

    // 使用完成后释放所有堆内存,避免内存泄漏
    for (int i = 0; i < word_count; i++) {
        free(word_array[i]);
    }
    free(word_array);
    return 0;
}
注意事项
  • 动态分配的堆内存必须手动释放,否则会出现内存泄漏。
  • 代码中增加了文件打开、内存分配的异常判断,避免空指针触发运行时崩溃。
  • 传入指针参数回传实际单词数,避免main函数访问数组时越界。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 23:18:15