有人说这个程序有个经典错误 是啥啊🙁🙁

img

上面说要用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)。这意味着:如果他们有可能擦掉程序中的其他数据(即把数据放到了存储别的数据的地方并将其覆盖)这样就很容易出现问题。

参考

C语言中gets_s(),gets(),fgets()函数的比较。_hunzhizi的博客-CSDN博客_gets_s 先来讲讲大家最熟悉的gets()函数。1.gets()函数不安全。2.C11标准委员会已经将其废除,建议能不用尽量不用。解释:gets()函数的作用:它读取整行输入,直至遇到换行符,然后丢弃换行符,储存其余字符,并在其末尾添加一个空字符使其成为一个字符串。听起来挺安全的,问题在于gets()函数不检查函数边界,有多少字符它就给你输入多少(来者不拒),这就造成了一个问题:缓冲区溢出(buffer overflow)。这意味着:如果他们有可能擦掉程序中的其他数据(即把数据放到了存储别的数据的地方并将其 https://blog.csdn.net/hunzhizi/article/details/106440589

如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!

img

n必须大于0