奇怪的scanf行为

时间:2017-07-05 16:47:37

标签: c scanf

我正在开发一个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

我预计会有内存泄漏,有人可以解释一下这种行为吗?

3 个答案:

答案 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()的返回值:如果转换失败,则返回0EOF并且目标未被修改,打印它具有未定义的行为。仅为整数键入+符号会导致转换失败。

以下是更正后的版本:

#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;
}