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
返回指针对象本身包含的字节数,不是指向的元素数量。
没有办法从指针值单独知道指向了多少元素; 您必须单独跟踪该信息。