malloc分配的二维数组地址不符合预期的原因是什么?
问题分析:二维数组内存分配的类型误解
你写的代码double (*t)[2] = malloc(sizeof(*t)*4);里,核心是没搞清楚double (*t)[2]的类型含义:
double (*t)[2]表示t是一个指针,指向的是一个包含2个double元素的一维数组。sizeof(*t)计算的是这个指向的数组的大小:2个double(每个8字节),所以是16字节。malloc(sizeof(*t)*4)就是分配4个这样的数组空间,总大小16*4=64字节,这部分你的计算是对的。
你预期t[0]和t[1]各容纳4个double,这是把维度搞反了。实际t指向的是一个“数组的数组”:外层是4个元素,每个元素是长度为2的double数组。所以:
- t[0]是第一个长度为2的double数组,地址是00C92490
- t[1]是第二个长度为2的double数组,地址自然比t[0]大16字节(也就是00C92490 + 16 = 00C924A0),和你实际看到的结果一致。
如果想实现“t[0]和t[1]各容纳4个double”的需求,应该把声明改成:
double (*t)[4] = malloc(sizeof(*t)*2);
此时sizeof(*t)是4*8=32字节,malloc分配2个这样的数组,总大小64字节,t[0]和t[1]的地址差就是32字节,符合你的预期。
内容的提问来源于stack exchange,提问作者hhh3
相关产品推荐
相关产品推荐

