为什么我的程序打印出奇怪的数组值?

时间:2014-09-11 10:21:41

标签: c arrays pointers

在我尝试学习一些有关指针的过程中,我尝试创建一个程序,为给定大小的数组分配内存(其中大小由常量ARR_SIZE的值定义)并打印出元素该数组到控制台。

我无法理解我得到的结果......例如,当我运行下面显示的代码时,我得到{0, 4206628, 4206628, 3, 4, 5, 6, 2686696, 8, 9},这对我来说完全没有意义。我想知道这种行为的原因是什么,以及为了获得预期的结果需要修改的内容。

#define ARR_SIZE 10

void print_array(int loc);
int memory_alloc();

int main()
{
    int array_loc = memory_alloc();

    print_array(array_loc);

    return 0;
}

void print_array(int loc)
{
    int i = 0;
    int *arr_ptr;

    arr_ptr = loc;

    while(i < ARR_SIZE)
    {
        printf("%d\n", *arr_ptr);
        *(arr_ptr++);
        i++;
    }
}

int memory_alloc()
{
    int array[ARR_SIZE];
    int i = 0;

    for(i; i < ARR_SIZE; i++)
    {
        array[i] = i;
    }

    return &array;
}

3 个答案:

答案 0 :(得分:2)

您观察到的是未定义行为,因为在memory_alloc中创建的数组仅存在于此函数的作用域中。程序离开后,该数组将不再存在。

另一种方法是在堆中分配数组:

int memory_alloc()
{
    int *array = malloc(ARR_SIZE * sizeof(int));
    int i = 0;

    for(i; i < ARR_SIZE; i++)
    {
        array[i] = i;
    }

    return array;
}

使用完阵列后,应该将其释放。

int main()
{
    int* array_pointer = memory_alloc();

    // use array here

    free(array_pointer);
    return 0;
}

答案 1 :(得分:1)

int array[ARR_SIZE];

这里整数数组是函数的局部数,在函数结束后它将不再可用。

要使它工作,你可以这样做

static int array[ARR_SIZE];

并且

return array; //no need &

答案 2 :(得分:1)

您在memory_alloc()函数中声明的数组

int array[ARR_SIZE];

这个数组是一个局部变量。它的作用域在函数memory_alloc()中,一旦该函数返回,所有局部变量都被销毁(你的数组[]也是如此)

相反,在main()中声明数组,并将数组传递给memory_alloc()。