为什么向gets函数传入malloc分配的char*参数仍无法正常运行?
C语言代码中gets调用异常原因说明
你遇到的gets执行失败并不是内存分配的问题,“malloc分配空间后可写入数据”的结论是正确的,异常原因来自输入缓冲区的残留换行符,具体逻辑如下:
scanf("%d", &n)执行时仅会读取输入的数字值,你输入数字后按下的回车生成的换行符\n会残留在标准输入缓冲区中,不会被scanf处理。gets()函数的读取规则为:从输入缓冲区读取内容直到遇到换行符\n为止,且会将读取到的\n替换为字符串结束符\0。因此当代码执行到gets(s)时,会直接读取到缓冲区残留的\n,相当于读取到了一个空字符串,表面看起来就像是gets没有执行直接跳过了,被误认为是调用失败。
修复方案
- 在
scanf执行完成后、调用gets前,清空输入缓冲区的残留内容,添加一行代码即可:
while(getchar() != '\n');
- 额外注意:
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
相关产品推荐
相关产品推荐

