Jon*_*Mee 2 c++ arrays memory-layout static-allocation
我知道这个答案违反了reinterpret_cast规则,但它也假设子阵列将被线性分配.
我相信这不能保证,但是当我搜索标准时,我发现我的信心摇摆不定.如果我静态分配2D数组,如下所示:
int foo[][4] = { { 5, 7, 8 },
{ 6, 6 },
{},
{ 5, 6, 8, 9 } };
Run Code Online (Sandbox Code Playgroud)
我可以假设所有元素都将线性分配吗?也就是说,如果foo[0]是在地址0x00000042,将:
foo[1] 在地址0x00000052foo[2] 在地址0x00000062foo[3] 在地址0x00000072这些地址是十六进制的,是的,它们为4元素子阵列提供了空间sizeof(int) == 4; 它们可能也可能不是零初始化.
子阵列是否保证线性分配?
是.无论数组的元素是子数组还是非数组对象,都可以保证它们在内存中连续存储.
为完整起见,这是标准报价:
[dcl.array]
- [snip]数组类型的对象包含一个连续分配的非空类型的N个子对象,类型为T. [snip]
T数组时没有例外.
所以我们知道这不能保证是这样的
const char[4].
相反,我们知道,这是保证char[4]就像它是保证其他类型的对象.
例如:const char first [] ="foo"; char foo [] [4] = {"bar","foo","","baz"}
first 会像这样存储在内存中:
{'f', 'o', 'o', '\0'}
Run Code Online (Sandbox Code Playgroud)
foo 会像这样存储:
{'b', 'a', 'r', '\0', 'f', 'o', 'o', '\0', '\0', '\0', '\0', '\0', 'b', 'a', 'z', '\0'}
Run Code Online (Sandbox Code Playgroud)
那么为什么你会说这是保证整数?
它可以保证int[4],char[4]以及您可以想象的任何其他类型.