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

标签 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;
}

最佳答案

您观察到的是未定义行为,因为在 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;
}

关于c - 为什么我的程序打印出奇怪的数组值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25784941/

相关文章:

c++ - 类内不可复制

c - C 中的管道和 I/O 重定向

c - 如何在执行过程中向文本文件添加信息? C

python - 在python中高效读取数组

c++ - 我应该删除来自其他函数或类方法的指针吗?

c - C中free()的异常行为

c - 为什么我们调用 Signal Handler 两次?

c - 目标代码,C语言中的链接时间

javascript - Meteor #each - 如何从变量中获取每个单独的项目并将其呈现在页面上?

Javascript - 将字符串分解为公式