【问题标题】:C - Double pointer array - not getting correct valuesC - 双指针数组 - 没有得到正确的值
【发布时间】:2021-05-28 13:43:51
【问题描述】:

上下文

我创建了这个简单的代码,其中我将各种数组存储在 my_arrays() 函数中,不同的函数(在我的示例中为 main())可以通过函数 my_arrays() 获取硬编码的数组。

在此处查看代码:

#include <stdio.h>

int my_arrays(int *size, int **arrays) {
    size[0] = 3;
    int array_1[3] = {1, 2, 3};
    arrays[0] = array_1;

    size[1] = 5;
    int array_2[5] = {2, 3, -5, 7, 11};
    arrays[1] = array_2;
}


int main() {
    int num_of_arrays = 2;
    int sizes[2];
    int *arrays[2];
    my_arrays(sizes, arrays);

    for (int i=0; i < num_of_arrays; i++) {
        int *array = arrays[i]; // point to sub-array
        int size = sizes[i];

        printf("array[%d]: {", i);
        for (int x=0; x < size; x++) {
            printf(" %d", array[x]);
        }
        printf(" }\n", i);
    }
    return 0;
}

然后在main() 中循环遍历子数组并循环遍历每个单独的数字并将其打印出来。

我希望上面的代码打印出来的是:

array[0]: { 1 2 3 }
array[1]: { 2 3 -5 7 11 }

但是在编译和运行时我得到了这个:

array[0]: { 1993067712 1617605192 -2 }
array[1]: { 3936256 8 6422188 7 6422476 }

为什么?

【问题讨论】:

    标签: arrays c pointers double-pointer


    【解决方案1】:

    my_arraysarray_1array_2 中是堆栈上的本地数组。一旦您从my_array 返回,它们就会失效。现在arrays[0]arrays[1] 持有指向无效或“陈旧”内存的指针。访问这是未定义的行为。

    (您看到的垃圾值表明您的数组已被堆栈空间的其他用途覆盖,可能是通过调用printf。)

    如果要创建数组,可以在堆上分配内存:

    int my_arrays(int *size, int **arrays)
    {
        size[0] = 3;
        arrays[0] = malloc(3 * sizeof(int));
        
        arrays[0][0] = 1;
        arrays[0][1] = 2;
        arrays[0][2] = 3;
    
        // ... initialize other arrays ...
        
        return 0;
    }
    

    你应该在使用完之后明确地释放它:

    // at the end of main
    
    for (int i=0; i < num_of_arrays; i++) {
        free(arrays[i]);
    }
    

    【讨论】:

    • 对,局部变量一退出函数就失效了。只是一个小细节:有没有办法在一行中定义数组的项(例如{1,2,3}),同时还分配内存(malloc)而不是用arrays[a][i] = n;定义每个数组项?
    • 不,你会丢失初始化语法; malloc 只是给你一大块原始数据,你必须通过分配给它来初始化。当您创建一个新数组时,您可以保留一个静态的、恒定的“模板”数组和memcpy 数据。当然,您也可以memcpy 本地数组的内容。对于它的价值,calloc 为您提供了归零的内存,这已经涵盖了很多情况。
    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 2021-09-20
    • 2020-03-22
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多