gpt4 book ai didi

c - y = 4; &y 在编译器的符号表中有名称吗?

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

我创建了一段代码来测试直接变量和间接变量(指针)

#include <stdio.h>
int x = 3;
int y = 4;

int main(void)
{
int *pointer;
*pointer = x;

printf("x's address is %p, x's value is %d.\n",pointer, *pointer);
printf("y's address is %p, x's value is %d.\n",&y, y);
return 0;
}

输出

$ ./a.out
x's address is 0x7ffee1b2d6d8, x's value is 3.
y's address is 0x10e0d301c, x's value is 4.

我可以看到 x 的地址存储在另一个内存块中,该内存块在编译器的符号表中被命名为指针作为变量,
&y怎么样,
y 的地址可以通过 &y 检索,它在某处留出一个内存块,&y 在编译器的符号表中是否有名称。

最佳答案

首先,以下是不正确的:

int *pointer;
*pointer = x;

pointer 未初始化,但您正在取消引用并存储 x。您可能打算分配 x 的地址,即 int *pointer = &x;

如果回答是,xy 最有可能有不同的符号。您可以使用 readelf(在 GNU 系统上)等工具验证:

readelf -Ws a.out

将显示符号,您可以查找 xy

请注意,符号和符号表等细节不在 C 标准的范围内(未指定/定义)。因此,这可能因系统而异。

此外,标准允许符合标准的编译器生成代码,只要 observed behaviour (也称为“假设规则”)受到尊重,这意味着“变量”可能并不总是出现在生成的代码中,因为编译器通常可能会消除它们(或将它们放入寄存器)。

P.S:为了打印地址,您需要按照格式说明符 %p 的要求将其转换为 void*:

printf("x's address is %p, x's value is %d.\n", (void*)pointer, *pointer);
printf("y's address is %p, y's value is %d.\n", (void*)&y, y);

关于c - y = 4; &y 在编译器的符号表中有名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52920577/

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