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

