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似乎也没有显示任何内容.请帮忙..
这不是"内存泄漏".问题是,第一个gets()调用从第一行输入两个维度时读取换行符; 它将零个字符放入缓冲区,但是你打印5,这就是为什么你得到一行垃圾.
在scanf()格式字符串的末尾添加"\n",以便scanf()使用换行符,您的程序将完美运行.请注意,这gets()是非常不安全的; 使用fgets(buf, n, stdin)是非常优选的.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |