gpt4 book ai didi

c - 使用 union 和堆进行双关语

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:57 25 4
gpt4 key购买 nike

我已经阅读了很多关于类型双关的内容以及仅使用强制转换是多么不好。

oldType* data = malloc(sizeof(oldType));
((newtype*)data)->newElement;

这会导致未定义的行为。所以解决方案是使用 union,这样编译器就知道这两个指针是相互链接的,所以它不会用严格的别名做一些有趣的事情。

话虽这么说, union 也看起来像:

union testing
{
struct test1 e;
struct test2 f;
}

如果在 union 中使用指针,是否定义了行为?

union testing
{
struct test1* e;
struct test2* f;
}

这是一个完整的例子:

#include <stdio.h>
#include <stdlib.h>

struct test1
{
int a;
char b;
};

struct test2
{
int c;
char d;
};

union testing
{
struct test1* e;
struct test2* f;
};

void printer(const struct test2* value);

int main()
{
struct test1* aQuickTest = malloc(sizeof(struct test1));
aQuickTest->a = 42;
aQuickTest->b = 'a';
printer(((union testing)aQuickTest).f);
((union testing)aQuickTest.f)->c = 111; // using -> not .
return 0;
}

void printer(const struct test2* value)
{
printf("Int: %i Char: %c",value->c, value->d);
}

或者我需要使用没有指针的 union 。然后使用 printer(&(((union testing)aQuickTest).f)); (使用 &)获取 f 的地址>.

最佳答案

像您的代码那样强制转换为 union 类型是不符合要求的:

    printer(((union testing)aQuickTest).f);

因此,就标准而言,您的代码确实具有未定义的行为。

但是,更直接地说,不,即使没有转换问题,您将指针放入 union 的方法也不能避免对指向类型的严格别名违规。在您的情况下,效果是您的 union testing 在范围内,实现不能假定 struct test1 **struct test2 **< 类型的对象 不要互相使用别名。这不会阻止通过 struct test2 类型的左值访问具有有效类型 struct test1 的对象而导致的未定义定义行为。

关于c - 使用 union 和堆进行双关语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398362/

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