C语言如何为控制台输入的单词分配恰好大小的字符数组内存
C语言动态适配输入长度的字符串读取实现
核心思路
C标准库没有自带安全读取任意长度字符串的内置函数,我们可以通过「初始缓冲区+动态扩容+最终缩容」的逻辑实现需求,完全适配输入内容的内存占用,不会浪费多余空间:
- 先在堆上申请一块较小的初始内存作为输入缓冲区
- 从控制台逐个读取字符存入缓冲区,缓冲区剩余空间不足时自动扩容
- 读取结束后将内存缩容到刚好能存储输入内容 + 字符串终止符
\0的大小
完整实现代码
#include <stdio.h> #include <stdlib.h> #include <string.h> char* read_dynamic_string() { int init_size = 16; // 初始缓冲区大小,可自行调整 char* buf = (char*)malloc(init_size); if (buf == NULL) return NULL; // 内存申请失败处理 int len = 0; // 当前已存储的字符长度 int c; // 存储getchar返回值,用int兼容EOF while ((c = getchar()) != '\n' && c != EOF) { // 剩余空间不足,需要扩容(预留1位存\0) if (len + 1 >= init_size) { init_size *= 2; // 2倍扩容,平衡性能和内存浪费 char* new_buf = (char*)realloc(buf, init_size); if (new_buf == NULL) { // 扩容失败释放原有内存,避免泄漏 free(buf); return NULL; } buf = new_buf; } buf[len++] = c; } // 缩容到刚好匹配输入长度的大小(len是字符数,+1存\0) char* result = (char*)realloc(buf, len + 1); if (result == NULL) { free(buf); return NULL; } result[len] = '\0'; // 补字符串终止符 return result; } int main() { printf("请输入单词:"); char* str = read_dynamic_string(); if (str != NULL) { printf("输入内容为:%s\n", str); printf("字符串占用内存大小(含\\0):%zu字节\n", sizeof(char) * (strlen(str) + 1)); free(str); // 用完必须释放动态申请的内存 } return 0; }
效果验证
输入hello时,程序最终返回的字符串内存大小为6字节,刚好存储h e l l o \0共6个字符,和需求完全匹配。
注意:动态申请的内存使用完成后必须调用
free()释放,否则会出现内存泄漏问题。
内容的提问来源于stack exchange,提问作者offerrall
相关产品推荐
相关产品推荐

