我通过为中间数组分配空间以及 1 大块中的实际元素来实现锯齿状多维数组。在处理这个问题时,我认为我必须考虑到存储元素的对齐,以防万一。但是我不确定是否需要进行这种安全检查,所以我已经开始问:指针的大小是否会保持对齐任何其他类型?
简而言之:给出来自对malloc 的调用的连续内存空间,如下所示:
| ARRAY OF POINTERS | ALIGN PADDING | ARRAY OF AN ARBITRARY ELEMENT TYPE |
当第一个数组由指针组成时,我真的需要填充吗?是否有必要填充的情况?
答案 0 :(得分:2)
您尚未指定回答此问题所需的所有必要详细信息。
所以这是一个需要填充的例子:
struct Element
{
unsigned long long x;
...
};
void* ptrArray[TOTAL_SIZE];
如果您在32位平台上运行 AND ,您已经定义了奇数个指针,那么您将需要一个4字节的填充以确保8字节的对齐变量在每个元素的开头。
另外,请注意,如果要在数组中存储多个元素,那么元素类型本身的大小必须是8个字节的倍数才能使其正常工作。
如果你想完全避免填充,那么每次你需要访问(读或写)特定元素时,你必须memcpy
一个元素来自和进入数组。
答案 1 :(得分:2)
C标准没有明确保证对象指针具有最严格的对齐要求。在某些系统上,long double
可能有更严格的对齐要求;在其他系统上,函数指针可能有更严格的对齐要求。
但是,只需稍加注意,您就可以确定对齐要求。你需要决定你需要答案的便携性和自动化程度。通过编译代码和找到答案很容易找到答案。为任何类型创建一个自动执行的万无一失的自动方式要困难得多,尤其是因为任意元素类型可能比对象指针更大或更小。