如何用malloc创建字符指针数组并为其元素赋值fgets的输出?
问题分析与修正方案
嘿,我来帮你搞定这个问题~你的代码核心问题确实是指针类型选错了,咱们一步步拆解修正:
为什么原代码不行?
你定义的char *words是一个指向单个字符/单条字符串的指针,用malloc(lines*sizeof(char))分配的只是一块能装lines个字符的内存空间。但你想要存储的是lines条独立的字符串(每条都是fgets的输出),这时候需要的是指针数组——也就是char **words,它的每个元素words[k]都是一个指向字符串的指针,这样才能装下多条字符串。
修正后的完整代码示例
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int lines = 5; // 假设你要存5条字符串 int mysize = 100; // 每条字符串最多100个字符 // 1. 声明指针数组,用来装lines个字符串指针 char **words; // 2. 给指针数组分配内存:lines个char*类型的空间 words = malloc(lines * sizeof(char *)); if (words == NULL) { perror("Failed to allocate memory for words array"); exit(EXIT_FAILURE); } int k; for (k = 0; k < lines; k++) { // 3. 给每个字符串分配内存 words[k] = malloc(mysize * sizeof(char)); if (words[k] == NULL) { // 内存分配失败时,要先释放已经分配的内存,避免泄漏 for (int i = 0; i < k; i++) { free(words[i]); } free(words); perror("Failed to allocate memory for single word"); exit(EXIT_FAILURE); } // 4. 用fgets读取内容到当前字符串 printf("Enter line %d: ", k+1); if (fgets(words[k], mysize, stdin) == NULL) { // 读取失败也要清理内存 free(words[k]); for (int i = 0; i < k; i++) { free(words[i]); } free(words); perror("Failed to read line"); exit(EXIT_FAILURE); } // 可选:去掉fgets末尾的换行符(因为fgets会把回车也读进来) size_t len = strlen(words[k]); if (len > 0 && words[k][len-1] == '\n') { words[k][len-1] = '\0'; } } // 测试输出所有读取的字符串 printf("\n你输入的内容是:\n"); for (k = 0; k < lines; k++) { printf("Line %d: %s\n", k+1, words[k]); } // 5. 用完后记得释放内存:先释放每个字符串,再释放指针数组 for (k = 0; k < lines; k++) { free(words[k]); } free(words); return 0; }
关键注意点
- 指针类型匹配:存储多个字符串必须用
char**,而不是char* - 分步分配内存:先给指针数组分配空间,再给每个字符串单独分配内存
- 内存检查:一定要检查
malloc和fgets的返回值,避免空指针或内存泄漏 - 内存释放顺序:释放时要先逐个释放每个字符串的内存,最后再释放指针数组本身
内容的提问来源于stack exchange,提问作者waayne
相关产品推荐
相关产品推荐

