C y=4;是吗?;y在编译器中有一个名称';什么是象征性的桌子?
我创建了一段代码来测试直接变量和间接变量(指针) 我可以看到x的地址存储在另一个内存块中,该内存块作为编译器符号表中的变量命名为pointer,C y=4;是吗?;y在编译器中有一个名称';什么是象征性的桌子?,c,C,我创建了一段代码来测试直接变量和间接变量(指针) 我可以看到x的地址存储在另一个内存块中,该内存块作为编译器符号表中的变量命名为pointer, &y怎么样, y的地址可以由&y检索,它在某处留出一个内存块,&y在编译器的符号表中是否有名称 首先,以下是不正确的: int *pointer; *pointer = x; 指针未初始化,但您正在取消引用并存储x。您可能想分配x的地址,即int*pointer=&x 如果回答是,则x和y很可能都有单独的符号。您可以使用readelf(在GNU系统上
&y怎么样,
y的地址可以由&y检索,它在某处留出一个内存块,&y在编译器的符号表中是否有名称 首先,以下是不正确的:
int *pointer;
*pointer = x;
指针未初始化,但您正在取消引用并存储x。您可能想分配x
的地址,即int*pointer=&x代码>
如果回答是,则x
和y
很可能都有单独的符号。您可以使用readelf
(在GNU系统上)等工具验证:
将显示符号,您可以查找x
和y
请注意,符号和符号表等细节不在C标准的范围内(未指定/定义)。因此,这可能因系统而异
此外,该标准允许符合标准的编译器生成代码,只要遵守(也称为“假设规则”),这意味着“变量”可能并不总是出现在生成的代码中,因为编译器通常可能会消除它们(或将它们放入寄存器)
注意:为了打印地址,您需要按照格式说明符的要求将其强制转换为无效*
%p
:
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);
首先,以下是不正确的:
int *pointer;
*pointer = x;
指针未初始化,但您正在取消引用并存储x。您可能想分配x
的地址,即int*pointer=&x代码>
如果回答是,则x
和y
很可能都有单独的符号。您可以使用readelf
(在GNU系统上)等工具验证:
将显示符号,您可以查找x
和y
请注意,符号和符号表等细节不在C标准的范围内(未指定/定义)。因此,这可能因系统而异
此外,该标准允许符合标准的编译器生成代码,只要遵守(也称为“假设规则”),这意味着“变量”可能并不总是出现在生成的代码中,因为编译器通常可能会消除它们(或将它们放入寄存器)
注意:为了打印地址,您需要按照格式说明符的要求将其强制转换为无效*
%p
:
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);
在源代码中使用
&y
时,编译器不需要创建新对象来存储y
的地址
符号表中的条目实际上是x
和y
的位置。(条目通常不是完整的地址,但通常是相对于符号所在部分的偏移量。)
因此,当使用&y
时,编译器会在生成的汇编代码中插入对y
的引用。链接器和/或加载程序使用y
的地址填写此引用
[上述内容当然不是C标准的一部分。它只是编译器、链接器和加载程序通常可以工作。]当您在源代码中使用
&y
时,编译器不需要创建新对象来存储y
的地址
符号表中的条目实际上是x
和y
的位置。(条目通常不是完整的地址,但通常是相对于符号所在部分的偏移量。)
因此,当使用&y
时,编译器会在生成的汇编代码中插入对y
的引用。链接器和/或加载程序使用y
的地址填写此引用
[上述内容当然不是C标准的一部分。通常只有编译器、链接器和加载程序可以工作。]
*pointer=x代码>无效。除非指针
首先有一个有效值,否则不能为*指针
赋值。这不是编译器的一个实现细节吗?我不明白为什么语言规范中会有这样的东西。指针在您的例子中没有初始化。你打印的东西都是垃圾。您可能需要int*pointer=&x代码>*指针=x代码>无效。除非指针
首先有一个有效值,否则不能为*指针
赋值。这不是编译器的一个实现细节吗?我不明白为什么语言规范中会有这样的东西。指针在您的例子中没有初始化。你打印的东西都是垃圾。您可能需要int*pointer=&x
我发现在链接示例中的用法中,*pointer=2
的赋值风格是完全不同的:指针指向有效的东西(在调用方),因此可以这样赋值。但是你的用法是不同的-与你的例子中的指针的值相比。你如何看待`table=malloc(sizeof*table*count)`我发现链接例子中用法中*pointer=2
的赋值风格是完全不同的:指针指向有效的东西(在调用者处),因此,它们可以这样分配。但是您的用法不同-与示例中的指针的值不同。您如何看待`table=malloc(sizeof*table*count)`
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);