C指针可以与任何其他数据类型对齐吗?

C指针可以与任何其他数据类型对齐吗?,c,arrays,pointers,memory-alignment,C,Arrays,Pointers,Memory Alignment,我通过为中间数组以及1大块中的实际元素分配空间,实现了一个交错多维数组。在处理这个问题时,我想我必须考虑到存储的元素的对齐方式,以防万一。但我不确定是否需要进行这种安全检查,所以我来问:指针的大小是否会使其他类型的指针保持对齐 简言之:从调用malloc得到一个连续的内存空间,如下所示: | ARRAY OF POINTERS | ALIGN PADDING | ARRAY OF AN ARBITRARY ELEMENT TYPE | 当第一个数组由指针组成时,我真的需要填充吗?是否存在需要填

我通过为中间数组以及1大块中的实际元素分配空间,实现了一个交错多维数组。在处理这个问题时,我想我必须考虑到存储的元素的对齐方式,以防万一。但我不确定是否需要进行这种安全检查,所以我来问:指针的大小是否会使其他类型的指针保持对齐

简言之:从调用malloc得到一个连续的内存空间,如下所示:

| ARRAY OF POINTERS | ALIGN PADDING | ARRAY OF AN ARBITRARY ELEMENT TYPE |

当第一个数组由指针组成时,我真的需要填充吗?是否存在需要填充的情况?

您尚未指定回答此问题所需的所有必要详细信息

下面是一个需要填充的示例:

struct Element
{
    unsigned long long x;
    ...
};

void* ptrArray[TOTAL_SIZE];
如果在32位平台上运行,并且定义了奇数个指针,则需要4字节的填充,以确保每个元素开头的8字节变量对齐

此外,请注意,如果要在数组中存储多个元素,则元素类型本身的大小必须是8字节的倍数才能正常工作


如果希望完全避免填充,则每次需要访问(读或写)该特定元素时,都必须从数组中输入元素。

C标准没有明确保证对象指针具有最严格的对齐要求。在某些系统上,
long double
可能有更严格的对齐要求;在其他系统上,函数指针可能有更严格的对齐要求


但是,只要稍加注意,就可以确定对齐要求。你需要决定答案的可移植性和自动化程度。通过编译代码并找到答案,很容易找到答案。要为任何类型创建一种简单的自动方式来自动执行这项操作要困难得多,尤其是因为任意元素类型可能比对象指针大或小。

指针的大小会使其他类型的对象保持一致吗?
大多数情况下都是这样,但我很好奇它是否有标准C的保证+1您可能有32位指针,同时存储64位值。。。对于奇数个值,肯定需要填充。您不应该“需要”超出与CPU字大小对齐所需的填充。不过,通过在更大的边界上对齐对象,您可能会获得一点加速。@MarkRansom SSE X86上的说明??根据指令的不同,它可能需要64位或128位对齐
T(*ptr)[dim2][dim3]=malloc(dim1*sizeof*ptr)。为了从函数返回,可以强制转换到
void*
。您的布局有一些用例(例如,如果您必须调用只需要锯齿数组的第三方函数),但似乎许多人不知道如何在数组维度和/或数组类型指针中使用非常量值