小编Ric*_*ant的帖子

C - 两个指针之间的转换行为

2020 年 12 月 11 日更新:感谢@“一些程序员老兄”在评论中提出的建议。我的根本问题是我们的团队正在实现一个动态类型存储引擎。我们分配了多个16 对齐的char array[PAGE_SIZE] 缓冲区来存储动态类型的数据(没有固定的结构)。出于效率原因,我们不能执行字节编码或分配额外的空间来使用memcpy.

既然已经确定了对齐方式(即16),剩下的就是使用指针的强制转换来访问指定类型的对象,例如:

int main() {
    // simulate our 16-aligned malloc
    _Alignas(16) char buf[4096];

    // store some dynamic data:
    *((unsigned long *) buf) = 0xff07;
    *(((double *) buf) + 2) = 1.618;
}
Run Code Online (Sandbox Code Playgroud)

但是我们的团队对这个操作是否是未定义的行为存在争议。


我已经阅读了许多类似的问题,例如

但是这些和我对C标准的解释不同,我想知道是不是我的误解。

主要的混淆是关于C11的第6.3.2.3 #7节:

指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针未正确对齐 68) 引用类型,则行为未定义。

68) 通常,“正确对齐”的概念是可传递的:如果指向类型 A 的指针与指向类型 B 的指针正确对齐,而指向类型 …

c pointers strict-aliasing language-lawyer

9
推荐指数
1
解决办法
223
查看次数

C - 用于算术的不兼容指针是否违反严格别名?

这个问题是我之前问过的问题的延伸。但是,经过一段时间后,我发现我的一些关于两个指针之间的转换行为的概念仍然很模糊。

为了便于讨论,我首先对主机实现做如下假设:

  • malloc:8 对齐
  • sizeof(int): 4, _Alignof(int): 4
  • sizeof(double): 8, _Alignof(double): 8

问题一:

void *ptr = malloc(4096);        // (A)

*(int *) ptr = 10;               // (B)               

/*
 * Does the following line have undefined behavior
 * or violate strict aliasing rules?
 */
*(((double *) ptr) + 2) = 1.618; // (C)

// now, can still read integer value with (*(int *) ptr)
Run Code Online (Sandbox Code Playgroud)

以我目前的理解,答案是否定的

根据 C11 的 [6.3.2.3 #7]:

指向对象类型的指针可以转换为指向不同对象类型的指针。如果结果指针未针对引用类型正确对齐,则行为未定义。...

和 C11 的 …

c pointers strict-aliasing language-lawyer

6
推荐指数
1
解决办法
145
查看次数

标签 统计

c ×2

language-lawyer ×2

pointers ×2

strict-aliasing ×2