C语言中使用malloc动态分配字符串数组及存储长度的技术问题
动态存储数量和长度未知的字符串解决方案
嘿,我来帮你搞定这个动态内存分配的问题!既然你已经通过命令行参数拿到了字符串的数量number,接下来分三步就能轻松搞定长度未知的字符串存储:
步骤1:分配存储字符串指针的数组
首先我们需要一个指针数组(类型为char**),用来存放每个字符串的内存地址。这个数组的大小就是你拿到的number,代码示例如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { // 先检查命令行参数合法性 if (argc < 2) { fprintf(stderr, "请输入字符串数量作为第一个参数!\n"); return 1; } int number = atoi(argv[1]); if (number <= 0) { fprintf(stderr, "字符串数量必须是正整数!\n"); return 1; } // 分配指针数组:每个元素是指向字符串的char*指针 char** str_array = malloc(number * sizeof(char*)); if (str_array == NULL) { perror("malloc failed for str_array"); return 1; }
步骤2:逐个读取字符串并分配对应长度的内存
接下来我们可以从标准输入读取每个字符串(你也可以根据需求从其他来源获取),先通过临时缓冲区拿到内容,计算长度后再分配刚好足够的内存存储:
for (int i = 0; i < number; i++) { printf("请输入第%d个字符串:", i+1); // 临时缓冲区先存读取到的内容(可根据需求调整缓冲区大小) char buffer[1024]; if (fgets(buffer, sizeof(buffer), stdin) == NULL) { perror("fgets failed"); // 分配失败时要释放已分配的内存,避免泄漏 for (int j = 0; j < i; j++) { free(str_array[j]); } free(str_array); return 1; } // 去掉fgets自带的换行符(如果存在) size_t len = strlen(buffer); if (len > 0 && buffer[len-1] == '\n') { buffer[len-1] = '\0'; len--; } // 分配刚好能存下字符串的内存(+1是给终止符'\0'留位置) str_array[i] = malloc(len + 1); if (str_array[i] == NULL) { perror("malloc failed for single string"); // 同样要清理已分配的内存 for (int j = 0; j < i; j++) { free(str_array[j]); } free(str_array); return 1; } // 把缓冲区内容复制到分配好的内存里 strcpy(str_array[i], buffer); }
步骤3:使用完后记得释放内存
动态分配的内存必须手动释放,避免内存泄漏,释放顺序要和分配顺序相反:
// 这里可以添加你的后续操作,比如遍历打印所有字符串 printf("\n你输入的所有字符串:\n"); for (int i = 0; i < number; i++) { printf("%d: %s\n", i+1, str_array[i]); } // 先释放每个字符串的内存,再释放指针数组 for (int i = 0; i < number; i++) { free(str_array[i]); } free(str_array); return 0; }
关键细节提醒
- 为什么用
char**?因为每个字符串是char*类型,我们需要一个数组来存放这些指针,所以用二级指针。 - 一定要检查
malloc的返回值!如果分配失败会返回NULL,不处理会导致程序崩溃。 - 临时缓冲区的作用:因为不知道字符串长度,先通过缓冲区拿到内容后再计算长度,能避免内存浪费。
内容的提问来源于stack exchange,提问作者ClockwerkSC
相关产品推荐
相关产品推荐

