从用户输入读取数组的函数会产生垃圾值

时间:2017-11-19 13:38:44

标签: c arrays

我已经定义了一个函数来读取整数数组并将其作为指针返回。

#include "stdafx.h"
#include <stdio.h>

const int size = 5;

int* getInput();
int main(int argc, _TCHAR* argv[])
{
    int* a = getInput();
    for(int i = 0; i < size; i++){
        printf("%d \n", a[i]);
    }
    return 0;
}

int* getInput(){
    int input[size];
    for(int i = 0; i < size; i++){
        scanf("%d", &input[i]);
    }
    return input;
}

问题在于输入:

1
2
3
4
5

这个程序打印的内容如下:

1
5242692
1474139472
872394811
-2

我无法理解为什么会这样。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

getInput()返回具有自动存储的本地数组的地址:在函数返回后访问此对象具有未定义的行为。您观察到的是由printf覆盖的数组内容,因为它为自己的局部变量使用相同的空间。行为未定义,这意味着任何事情都可能发生,包括程序失败。

还要避免定义全局变量,尤其是使用简单名称,例如size

您应该传递目标数组及其元素数量:

#include <stdio.h>

int getInput(int *dest, int size);

int main(int argc, char *argv[]) {
    const int size = 5;
    int input[size];

    int n = getInput(input, size);
    for (int i = 0; i < n; i++) {
        printf("%d\n", a[i]);
    }
    return 0;
}

int getInput(int *dest, int size) {
    int i;
    for (i = 0; i < size; i++) {
        if (scanf("%d", &input[i]) != 1)
            break;
    }
    /* return the number of integers successfully read from stdin */
    return i;
}

答案 1 :(得分:1)

函数中的数组 - 它的生命周期在函数结束时结束。要做你想做的事,你需要分配内存并返回它。因为它的生命将持续到程序结束或你释放它。

您可能想要这样做:

int *input = malloc(sizeof *input *size);
if( input == NULL)
{
   // error
}

..
return input;

在您的情况下,您通过访问超出范围的变量来调用未定义的行为。

int* getInput(){
    int *input = malloc(sizeof *input *size);
    if( input == NULL)
    {
       fprintf(stderr,"%s","Error in allocation");
       exit(1);
    }
    for(size_t i = 0; i < size; i++){
        scanf("%d", &input[i]);
    }
    return input;
}

应释放使用malloc获得的已分配内存以避免内存泄漏。完成工作后即可完成。

main()中你只需要释放记忆。

int main(int argc, _TCHAR* argv[]){
    ...
    ...
    free(a);
}

这里不是使用常量变量size,而是可以将它传递给函数并分配不同数量的内存并相应地从用户获取输入。对于较大的size值,您可以将size的值传递给函数。

检查scanf()的返回值是件好事。所以对它的调用应该是

if( scanf("%d",&input[i])== 1)
  // ok

您可以查看详细讨论here