了解C中的别名

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

我要定义

  

两个表达式具有相同的别名   与他们相关联的位置。

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

了解C中的别名

目标是为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

有人可以解释一下我是否做得正确,如果做错了吗?

limo2737 回答:了解C中的别名

“别名”仅表示备用名称。在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标准中的规则并未定义访问数组的行为,即使我们以某种方式知道在内存中跟随它的是什么。 / p>

,

通常有一个简单的规则适用于block-statement(例如{...}):(a)考虑自动分配(或由于 而发生的分配在堆栈上的函数调用)和(b),考虑用户分配(或由于{em> struct或{{ 1}}):

对于union(a)sizeof operator,以确定summed的数量。

对于stack allocation(b)sizeof operator,以确定multiplied的位置。

需要说明的是,其他存储类可能会有不同的结果,但是通常这些是您在使用C进行编程时将最有经验的。

本文链接:https://www.f2er.com/3156895.html

大家都在问