gpt4 book ai didi

c - 将指向一种类型的指针转​​换为指向另一种类型的指针的限制

转载 作者:太空宇宙 更新时间:2023-11-03 23:37:45 24 4
gpt4 key购买 nike

我在理解“指向”类型的转换时遇到了一些麻烦。让我举一些例子:

struct test{
int x;
int y;
};

1.

void *ptr = malloc(sizeof(int));
struct test *test_ptr = ptr; //OK 7.22.3(p1)
int x = test_ptr -> x; //UB 6.2.6.1(p4)

2.

void *ptr = malloc(sizeof(struct test) + 1);
struct test *test_ptr = ptr + 1; //UB 6.3.2.3(p7)

3.

void *ptr = malloc(sizeof(struct test) + 1);
struct test *test_ptr = ptr; //OK 7.22.3(p1)
int x = test_ptr -> x; //Unspecified behavior or also UB?

我对案例的理解:

  1. malloc 返回的指针转换本身就可以作为 7.22.3(p1):

The pointer returned if the allocation succeeds is suitably aligned so that it may be assigned to a pointer to any type of object with a fundamental alignment requirement

访问不正确,因为 test_ptr 不能指向有效的 struct test_ptr 对象,因为它的大小小于用 malloc 分配的对象导致 UB,如 6.2.6.1(p4) 所述。

  1. 这是 UB,因为我们无法说明 ptr + 1 指针的对齐方式。 6.3.2.3(p7) 对此进行了解释:

A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned68) for the referenced type, the behavior is undefined.

标准中如何解释案例 3?

如果将指向未声明类型的对象的指针转换为指向大小小于分配对象的对象的指针是否有效,标准中未指定(至少我找不到)? (我没有考虑像 malloc(10 * sizeof(struct test)); 这样的数组分配,这在 7.22.3(p1) 中有清楚的解释)。 6.2.6.1(p4) 指出:

Values stored in non-bit-field objects of any other object type consist of n × CHAR_BIT bits, where n is the size of an object of that type, in bytes.

分配的对象不包含sizeof(struct test) x CHAR_BIT位,而是(sizeof(struct test) + 1) x CHAR_BIT

最佳答案

这必须是合法的,因为在 C 中我们有 flexible array members .

typedef struct flex_s {
int x;
int arr[];
} flex_t;
void *ptr = malloc(sizeof(flex_t) + sizeof(int));
flex_t *flex = ptr;
flex->arr[0]; // legal

所以,如果你想从标准中得到答案,看看它对灵活数组成员的定义和它们的分配,就会给出规则。

您可以先看一下 the free draft of C11 第 114 页的示例 20。 .

关于c - 将指向一种类型的指针转​​换为指向另一种类型的指针的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54746811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com