下面这段代码的输出是多少?
#define PRINT_SIZEOF(a) printf("sizeof("#a##") = %u\n", (unsigned int)sizeof(a))
int pnData1[3][5];
PRINT_SIZEOF(pnData1);
PRINT_SIZEOF(pnData1 + 0);
PRINT_SIZEOF(pnData1[1]);
PRINT_SIZEOF(pnData1[1] + 0);
PRINT_SIZEOF(*pnData1);
int *pnData2 = new int[6];
PRINT_SIZEOF(pnData2);
该回答引用GPTᴼᴾᴱᴺᴬᴵ
这段代码的输出应该是:
sizeof(pnData1) = 60
sizeof(pnData1 + 0) = 4
sizeof(pnData1[1]) = 20
sizeof(pnData1[1] + 0) = 4
sizeof(*pnData1) = 20
sizeof(pnData2) = 4
下面是每个 PRINT_SIZEOF 的解释:
PRINT_SIZEOF(pnData1):输出 pnData1 整个数组的大小,其中有 3 个元素,每个元素又是一个有 5 个 int 元素的数组,因此大小为 3 * 5 * sizeof(int),即 60 字节。
PRINT_SIZEOF(pnData1 + 0):输出 pnData1 + 0 的大小,其中 pnData1 是一个指向 int[5] 数组的指针,加上 0 后仍是指向 int[5] 数组的指针,因此大小为 4 字节(32 位平台)或 8 字节(64 位平台)。
PRINT_SIZEOF(pnData1[1]):输出 pnData1 的第二个元素,即 pnData1[1] 的大小,这是一个有 5 个 int 元素的数组,因此大小为 5 * sizeof(int),即 20 字节。
PRINT_SIZEOF(pnData1[1] + 0):输出 pnData1[1] + 0 的大小,其中 pnData1[1] 是一个指向 int 的指针,加上 0 后仍是指向 int 的指针,因此大小为 4 字节(32 位平台)或 8 字节(64 位平台)。
PRINT_SIZEOF(*pnData1):输出 *pnData1 的大小,其中 *pnData1 等价于 pnData1[0],这是一个有 5 个 int 元素的数组,因此大小为 5 * sizeof(int),即 20 字节。
PRINT_SIZEOF(pnData2):输出 pnData2 的大小,其中 pnData2 是一个指向 int 的指针,因此大小为 4 字节(32 位平台)或 8 字节(64 位平台)。pnData2 实际上是动态分配的内存,因此其大小只包括指针本身,不包括指向的内存块的大小。
第5行,pnData1是二维数组,sizeof得到数组的字节总数,60
第6行,加上0以后,就当做指针用了,所以任意类型指针的sizeof结果都是4
第7行,是二维数组的行数组长度,每行5个元素,长度为4 * 5 = 20
第8行,同样加0就变成指针了,长度是4
第9行,与第7行类似,是第0行数组,长度20
第12行,pnData2是指针,所以长度4