C – 动态数组

我不太明白指针如何与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 

为什么?!

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

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

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

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

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

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

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

首先,应该是arrayThree的分配

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

由于arrayThree的类型是int ** ,因此*arrayThree的类型是int *

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

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