gpt4 book ai didi

c - 理解C中的别名

转载 作者:行者123 更新时间:2023-11-30 18:10:13 25 4
gpt4 key购买 nike

我试图了解如何正确创建别名。

我要放弃定义

Two expressions are aliases of each other if they have the same location associated with them.

下面是显示内存分配的框图

目标是为 a[1] 创建别名

盒子的边缘是指位置,里面的圆圈是指存储的值。

我认识到b[1]其值为 a[1] 的地址。所以

认为为了创建别名,我所要做的就是创建一些变量并为其分配值 b[1] .

为了测试我的假设是否正确,我尝试了以下操作:

struct T *alias = *b[2];

printf("alias location is: %p\n", alias);
printf("a[2] location is: %p\n", a[2]);

产生:

alias location is: 0x561936c62320
a[2] location is: 0x561936c62320

地址匹配,但我很困惑我是否做得正确。我不需要使用 & printf() 中的运算符函数为了打印实际地址?当我这样做时:

struct T *alias = *b[2];

printf("alias location is: %p\n", &alias);
printf("a[2] location is: %p\n", &a[2]);

我得到的地址不正确:

alias location is: 0x7ffdee2cd320
a[2] location is: 0x7ffdee2cd340

有人可以解释一下我是否正确地执行了该操作,如果不正确,如何正确执行该操作?

最佳答案

“别名”只是指替代名称。在 C 语言中,我们所说的“别名”中的“名称”是左值。根据 C 2018 6.3.2.1 1,“左值是一个表达式……它可能指定一个对象……”如果同一事物有两个左值,则该事物有两个别名(或者您可以指定一个作为主要名称)另一个作为别名)。

最简单的是,在 int b; 之后,bb 命名的对象的左值。并且,在 int *p = &b; 之后,*p 是同一对象的左值。那么b*p是同一个对象的别名。

您所显示的图表的含义不清楚。其中一部分将 ab 显示为简单的标量对象。另一部分将它们显示为数组。如果没有更多的上下文和解释,就不可能可靠地解释它。

如果我们有一个 int a[1] 和一个 int b[1],并且编译器恰好将 b 放入内存中紧跟在a之后,那么a[1]在某种意义上是b[0]的别名,但使用它是不合适的,因为 C 标准中的规则没有定义越界访问数组的行为,即使我们以某种方式知道内存中数组后面的内容。

关于c - 理解C中的别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58718244/

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