C:二维数组的 Sizeof - 指针和第一个元素之间的区别
C: Sizeof of 2D-array - difference between pointer and first element
我在 C 中有一个类似于以下二维数组的数组:
uint16_t myArray[2][14] = {
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
{ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114}
};
我想获取数组的大小并使用了:
printf("size: %d \n", sizeof(myArray) / sizeof( * myArray));
结果
size: 2
当我使用第一个子数组的第一个元素时
printf("size: %d \n", sizeof(myArray) / sizeof(myArray[0][0]));
...我得到了正确的结果:
size: 28
这是因为我用 2 个子数组初始化数组还是有其他解释?
当你使用这个得到数组的长度时:
printf("size: %d \n", sizeof(myArray) / sizeof( * myArray));
您正在获取数组的大小,然后将其除以第一个元素的大小,而第一个元素又是另一个数组。因为它里面还有另一个数组,其长度在变量声明中描述,所以它将获得数组的大小而不是 *uint16_t
。实际上,你得到了整个数组分配的内存量,然后将它除以数组内部分配的内存量的大小,因为只有两个元素,所以是 2.
Whole 2D array (28 * sizeof(uint16_t)): 001, 002, 003, 004, 005, 006, 007, 008, 009, 010, 011, 012, 013, 014, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114
1D array inside 2D (14 * sizeof(uint16_t)): 001, 002, 003, 004, 005, 006, 007, 008, 009, 010, 011, 012, 013, 014
当使用里面元素的大小时,你是将28 * sizeof(uint16_t)
除以14 * sizeof(uint16_t)
,即2。但是,当使用里面元素的大小时,你是将[=14]除=] 通过 sizeof(uint16_t)
,即 28.
希望这是有道理的:)
我在 C 中有一个类似于以下二维数组的数组:
uint16_t myArray[2][14] = {
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14},
{ 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114}
};
我想获取数组的大小并使用了:
printf("size: %d \n", sizeof(myArray) / sizeof( * myArray));
结果
size: 2
当我使用第一个子数组的第一个元素时
printf("size: %d \n", sizeof(myArray) / sizeof(myArray[0][0]));
...我得到了正确的结果:
size: 28
这是因为我用 2 个子数组初始化数组还是有其他解释?
当你使用这个得到数组的长度时:
printf("size: %d \n", sizeof(myArray) / sizeof( * myArray));
您正在获取数组的大小,然后将其除以第一个元素的大小,而第一个元素又是另一个数组。因为它里面还有另一个数组,其长度在变量声明中描述,所以它将获得数组的大小而不是 *uint16_t
。实际上,你得到了整个数组分配的内存量,然后将它除以数组内部分配的内存量的大小,因为只有两个元素,所以是 2.
Whole 2D array (28 * sizeof(uint16_t)): 001, 002, 003, 004, 005, 006, 007, 008, 009, 010, 011, 012, 013, 014, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114
1D array inside 2D (14 * sizeof(uint16_t)): 001, 002, 003, 004, 005, 006, 007, 008, 009, 010, 011, 012, 013, 014
当使用里面元素的大小时,你是将28 * sizeof(uint16_t)
除以14 * sizeof(uint16_t)
,即2。但是,当使用里面元素的大小时,你是将[=14]除=] 通过 sizeof(uint16_t)
,即 28.
希望这是有道理的:)