gpt4 book ai didi

c - 匿名对象存储在哪里?

转载 作者:行者123 更新时间:2023-12-04 15:11:26 25 4
gpt4 key购买 nike

我希望它们存储在 text 段中,但简短的调查显示它们不是(我使用了 clang 编译器)。那么它们存储在哪里呢?指向匿名对象的指针是全局定义的(在任何范围之外),如下所示:

int *garr = (int[]){1, 2, 3, 4, 5};
void *grec = &(struct {float a; char b;}){0, 1};

我定义了一个指向字符串文字的指针和一些全局常量变量:

char *gstr = "Global string";
const short global_const = 5;
static const unsigned static_global_const = 10;

然后我为 data 段定义了一些变量,也是全局变量:

int data_x = 1;
char data_y = 2;
static float data_z = 3;

然后我检查了所有这些地址和 gstr 指针的内容,以了解 textdata 在哪里段是。结果是这样的(lstr 是指向另一个字符串文字的指针,但在 main 范围内定义):

gstr == 0x4009a8
lstr == 0x400a18
&global_const == 0x400bb4
&static_global_const == 0x400bbc

&data_x == 0x601070
&data_y == 0x601074
Static: &data_z == 0x601078

我在这里看到的是前 4 个地址来自 text 段,而后 3 个地址来自 data 段。我原以为匿名对象会在前 4 个地址附近,但我看到了这个:

garr == 0x601040
grec == 0x601060

对我来说,它们看起来像是存储在 data 段中,即使这些对象是只读文字。为什么?

最佳答案

编译器通常将字符串文字放在只读部分中,因为它们是只读的。同样,初始化的非只读数据被放入可修改的数据部分,因为这就是它的用途。

复合文字不是只读的,除非它是用 const 限定类型定义的,因此编译器可能会将非 const 限定的复合文字放在可修改的部分中。

(当然,C 标准允许 C 实现按照他们喜欢的方式安排内存,因此编译器没有义务将相同的部分用于它用于其他数据的复合文字。)

关于c - 匿名对象存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65167301/

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