上面说要用new分配空间
错误的话,应该是在使用gets(pp)前,没有判断pp是否是空指针,同理,free(pp)这里也没有判断,另外,在main函数中,pp也没有初始化。vs2019中编译可能会报错。
代码修改如下:
#include <stdio.h>
#include <stdlib.h>
char* newch(int n)
{
char* p;
p = (char*)malloc(n*sizeof(char));
return p;
}
void freech(char* pp)
{
if(pp)
free(pp);
}
int main()
{
int n;
char* pp = 0; //这里初始化
printf("input n:");
scanf("%d",&n);
getchar();
pp = newch(n);
if(pp)
{
gets(pp);
puts(pp);
freech(pp);
pp = 0;
}
return 0;
}
这个经典错误应该是指gets()函数不安全。
解释:
gets()函数的作用:它读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在其末尾添加一个空字符使其成为一个字符串。
听起来挺安全的,问题在于gets()函数不检查函数边界,有多少字符它就给你输入多少(来者不拒),这就造成了一个问题:缓冲区溢出(buffer overflow)。这意味着:如果他们有可能擦掉程序中的其他数据(即把数据放到了存储别的数据的地方并将其覆盖)这样就很容易出现问题。
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
n必须大于0