You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:27:02