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

  • 本文关键字:函数 数组 读取 用户 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

我不明白为什么会这样。谁能帮我解决这个问题?

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("%dn", 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;
}

函数中的数组 - 当函数结束时,它的生存期结束。要执行您期望执行的操作,您需要分配内存并将其返回。因为它的生命周期将一直持续到程序结束或您释放它。

您可能希望执行以下操作:

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

您可以在此处查看详细讨论。

最新更新