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

为什么向gets函数传入malloc分配的char*参数仍无法正常运行?

C语言代码中gets调用异常原因说明

你遇到的gets执行失败并不是内存分配的问题,“malloc分配空间后可写入数据”的结论是正确的,异常原因来自输入缓冲区的残留换行符,具体逻辑如下:

  • scanf("%d", &n)执行时仅会读取输入的数字值,你输入数字后按下的回车生成的换行符\n会残留在标准输入缓冲区中,不会被scanf处理。
  • gets()函数的读取规则为:从输入缓冲区读取内容直到遇到换行符\n为止,且会将读取到的\n替换为字符串结束符\0。因此当代码执行到gets(s)时,会直接读取到缓冲区残留的\n,相当于读取到了一个空字符串,表面看起来就像是gets没有执行直接跳过了,被误认为是调用失败。

修复方案

  1. 在scanf执行完成后、调用gets前,清空输入缓冲区的残留内容,添加一行代码即可:
while(getchar() != '\n');
  1. 额外注意:gets()函数因为没有输入长度边界检查,极易引发缓冲区溢出漏洞,已经在C11标准中被正式移除,生产环境中建议替换为fgets()等安全的输入函数。

修复后的参考代码:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
    char * s;
    int n;
    do{
        printf("string's length: ");
        scanf("%d", &n);
    }while(n<=0);
    // 清空scanf残留的换行符
    while(getchar() != '\n');
    s = (char *) malloc((n+1) * sizeof(char));
    if(s!=NULL){
        printf("enter a string (length <= %d): ", n);
        gets(s);
        puts(s);
        free(s);
    }
    puts("end of programme.\n");
    return 0;
}

内容的提问来源于stack exchange,提问作者Simo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:36:04