指针始终是字节对齐的

时间:2010-06-15 09:56:36

标签: c pointers

我读过像指针必须是字节对齐的东西。 我对典型的32位架构的理解......所有指针都是字节对齐的......不是吗?

请确认。

可以有一个非字节对齐的指针吗?

基本上,这在tx描述符存储器的硬件​​参考手册中有所提及。

3 个答案:

答案 0 :(得分:9)

是的,您无法处理小于一个字节的任何内存量。

答案 1 :(得分:5)

在C中,指针指向一个对象†

唯一不是整数字节的对象是位字段。

C语言不允许您创建指向位字段的指针;此代码将导致编译器错误:“无法获取位字段'b'的地址”:

struct S { unsigned int a:4, b:4, c:4, d:3, e:1; };

int main ( void ) {
    struct S s;
    int *i = &s.b; // would point half a byte into s
    return 0;
}

指针只能增加它们指向的对象大小的整数。

由于无法创建指向大小小于一个字节的对象的指针,或者将指针递增少于一个字节,因此不能有一个小于一个字节对齐的指针。

†​​在C意义上,而不是OO意义

答案 2 :(得分:1)

如果指针或数字不是字节对齐的,它将从一个字节的中间开始。即一个字节的某些位属于一个指针,而其他位属于另一个指针。这很奇怪,在实践中不会发生。