这个简单的C代码有什么问题?

Rus*_*aul 0 c error-handling memory-leaks

#include <stdio.h>

int main()
{
    int m,n; scanf("%d %d",&m,&n);
    char ar[m][n];
    char buf[n];
    int a,b;
    for(a=0;a<m;a++)
    {
        gets(buf);
        for(b=0;b<n;b++) ar[a][b] = buf[b];
    }
    for(a=0;a<m;a++,printf("\n")) for(b=0;b<n;b++) printf("%c",ar[a][b]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码从m行作为输入stdin,每行包含n个字符,并打印所有行stdout.就那么简单.但似乎存在内存泄漏,因为gets(buf)遇到第一次,它的执行被跳过.

我也在C++中尝试过,认为内存泄漏会消失.这是代码:

#include <cstdio>
using namespace std;

int main()
{
    int m,n; scanf("%d %d",&m,&n);
    char **ar = new char*[m];
    char *buf = new char[n];
    int a,b;
    for(a=0;a<m;a++)
    {
        gets(buf);
        ar[a] = new char[n];
        for(b=0;b<n;b++) ar[a][b] = buf[b];
    }
    for(a=0;a<m;a++,printf("\n")) for(b=0;b<n;b++) printf("%c",ar[a][b]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但它的表现完全一样.

以下是一些示例输入和输出:

2 3
abc
def
Run Code Online (Sandbox Code Playgroud)

输出:

x??
abc
Run Code Online (Sandbox Code Playgroud)

GDB似乎也没有显示任何内容.请帮忙..

Ern*_*ill 5

这不是"内存泄漏".问题是,第一个gets()调用从第一行输入两个维度时读取换行符; 它将零个字符放入缓冲区,但是你打印5,这就是为什么你得到一行垃圾.

scanf()格式字符串的末尾添加"\n",以便scanf()使用换行符,您的程序将完美运行.请注意,这gets()是非常不安全的; 使用fgets(buf, n, stdin)是非常优选的.