3

我不太明白指针如何与 C 数组一起工作。这是我得到的一些代码:

int arrayOne[] = {1, 2, 3};
int arrayTwo[] = {4, 5, 6, 7};

int **arrayThree = (int **)malloc(2 * sizeof(int));
arrayThree[0] = arrayOne;
arrayThree[1] = arrayTwo;

for (int i = 0; i < 2; i++) {
    int *array = arrayThree[i];
    int length = sizeof(array) / sizeof(int);
    for (int j = 0; j < length; j++)
        printf("arrayThree[%d][%d] = %d\n", i, j, array[j]);
}

我本来希望这会输出以下内容:

arrayThree[0][0] = 1
arrayThree[0][1] = 2
arrayThree[0][2] = 3
arrayThree[1][0] = 4
arrayThree[1][1] = 5
arrayThree[1][2] = 6
arrayThree[1][3] = 7

它实际打印出来的是:

arrayThree[0][0] = 1
arrayThree[0][1] = 2
arrayThree[1][0] = 4
arrayThree[1][1] = 5

为什么?!

4

4 回答 4

11

sizeof(array)是指针的大小,恰好是int您平台上的大小的两倍。

没有办法在 C 中获取数组的长度。你只需要自己记住它。

于 2011-03-07T14:54:40.227 回答
4

首先int **arrayThree = (int **)malloc(2 * sizeof(int))是错的,应该是sizeof(int *)

接下来,sizeof(array) / sizeof(int)对应sizeof(int *) / sizeof(int)哪个不是你想要的。

在您视为数组的指针中没有“嵌入”大小信息,您需要手动管理大小。

于 2011-03-07T14:54:54.160 回答
1

在 C 中没有内置机制来跟踪数组的大小,您需要自己维护它,并将其传递给任何将数组作为参数的函数。

但是,如果您确实需要在 C 中以动态方式广泛使用数组,您可以在 C 中构建自己的动态数组库,而无需太多努力。有关详细信息,请参阅以下教程:goo.gl/vYhkF。

于 2011-03-07T15:09:24.537 回答
0

首先,分配的arrayThree应该是

int **arrayThree = malloc(2 * sizeof *arrayThree);

既然 的 类型arrayThreeint **, 那么 的 类型*arrayThree就是int *

sizeof (array) / sizeof (int)没有返回您期望的原因array指针(类型int *),而不是数组类型,因此返回指针对象sizeof本身包含的字节数,而不是指向的元素数。

仅从指针值无法知道指向了多少个元素;您必须单独跟踪该信息。

于 2011-03-07T15:40:02.703 回答