使用getchar()读取标准输入可变长度字符串的C程序崩溃原因求解
问题原因
你的代码存在4个核心错误,触发了内存越界访问导致崩溃:
realloc扩容逻辑错误:每次调用realloc时你都只申请1字节的内存,随着下标i递增,list[i]的写入操作会直接访问到分配空间外的内存,属于典型的堆缓冲区溢出。- 缺少字符串结束符:C语言中
printf("%s")要求传入的字符串必须以\0作为结束标记,你的代码存储完所有输入字符后没有补充结束符,printf会持续向后读取内存直到遇到随机的\0或者访问到非法地址。 getchar返回值接收类型错误:getchar()的返回值是int类型,除了正常字符外还会返回EOF(值为-1),用char类型存储会出现截断,无法正确判断输入结束的边界。- 缺少内存分配结果校验:
malloc、realloc分配失败时会返回NULL,直接对空指针解引用也会触发崩溃。
修正后可正常运行的代码
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { char *list = NULL; // 初始分配1字节空间存结束符 list = malloc(sizeof(char)); if (list == NULL) { perror("malloc failed"); return 1; } int a; int i = 0; while ((a = getchar()) != '\n' && a != EOF) { list[i] = (char)a; // 扩容为i+2字节:i+1存下一个字符,最后1位留作结束符 char *tmp = realloc(list, sizeof(char) * (i + 2)); if (tmp == NULL) { perror("realloc failed"); free(list); return 1; } list = tmp; ++i; } // 补充字符串结束符 list[i] = '\0'; printf("%s\n", list); free(list); return 0; }
内容的提问来源于stack exchange,提问作者visitor
相关产品推荐
相关产品推荐

