我正在开发一个C程序,我发现了一个奇怪的行为scanf
:
#include <stdio.h>
int main() {
int *a, i;
printf("Hello, World!\n");
for (i = 0; i < 10; i++) {
scanf("%u", &a[i]);
}
for (i = 0; i < 10; i++) {
printf("%d\n", a[i]);
}
return 0;
}
对于10个输入,我发送了+
,输出如下:
1
0
239646720
32767
0
0
239646727
32767
239646771
32767
我预计会有内存泄漏,有人可以解释一下这种行为吗?
答案 0 :(得分:1)
如果您只是想将10个整数存储到数组中并稍后打印它们,则可以: -
#include<stdio.h>
int main()
{
int a[9],i ;
printf("Hello, World!\n");
for(i = 0;i<10;i++)`
{
scanf("%u",&a[i]);
}
for(i = 0;i<10;i++)
{
printf("%d\n",a[i]) ;
}
return 0;
}
答案 1 :(得分:0)
由于您没有动态分配任何内存,因此不会出现内存泄漏。但是,您正在访问未分配的内存,这与内存泄漏不同。
我不确定你要通过输入+来完成什么,但使用未初始化指针的行为是未定义的。
答案 2 :(得分:0)
代码中存在多个问题:
a
是一个未初始化的指针,您应该将其定义为10 int
的数组。按照编码,你的程序有不确定的行为,它完全运行是非常令人惊讶的。scanf()
的返回值:如果转换失败,则返回0
或EOF
并且目标未被修改,打印它具有未定义的行为。仅为整数键入+
符号会导致转换失败。以下是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a[10], i;
printf("Hello, World!\n");
for (i = 0; i < 10; i++) {
if (scanf("%u", &a[i]) != 1) {
fprintf(stderr, "input error\n");
exit(1);
}
}
for (i = 0; i < 10; i++) {
printf("%d\n", a[i]);
}
return 0;
}