Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C y=4;是吗?;y在编译器中有一个名称';什么是象征性的桌子?_C - Fatal编程技术网

C y=4;是吗?;y在编译器中有一个名称';什么是象征性的桌子?

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系统上

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

我可以看到x的地址存储在另一个内存块中,该内存块作为编译器符号表中的变量命名为pointer,
&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);