gpt4 book ai didi

c - 单独声明和初始化的变量如何在内存中工作?

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

我有一个关于计算机内存工作的问题。我试图自己得到答案,但我无法弄清楚它是如何工作的。所以,想象一下当一个人声明一个指向 future 字符串的指针的情况;但是,初始化会稍晚一些:

char *str; 

之后,他或她想要声明另一个变量。

char her;  

紧接着,两个变量都被初始化,它们的地址和值被打印到 STDOUT。整个程序如下所示:

int     main(void)
{
char *str;
char her;

her = 'Y';
str = "HelloMuraMana";
printf("%p\n", (void *)&str);
printf("%p\n", (void *)&(str[1]));
printf("%p\n", (void *)&(str[2]));
printf("%p\n", (void *)&(str[3]));
printf("%p\n", (void *)&(str[4]));
printf("%p\n", (void *)&her);
return (0);
}

现在,我的问题是:计算机如何为两个变量(尤其是字符串字符)分配内存。我还想添加一张我的 macOS 机器显示给我的图片:

CLICK HERE to see the results

编辑:
我对内存在这里的工作方式特别感兴趣。另外,请注意 str[0] 有一个地址,而 str 1 , str[2], str[3], 和 str[4] 有其他的,不连续的第一个元素地址。

最佳答案

正如我在评论中所说,内存中事物具体化方式的细节因平台而异。但是,这里有一个非常高级的 View ,应该可以让您了解事物的工作原理。

首先,在 C 编程语言的上下文中,对象可以具有以下几种存储持续时间之一:staticautomatic已分配,和本地线程。具有static 存储持续时间的对象在程序启动时立即分配,并在程序退出时释放。具有 automatic 存储持续时间的对象在进入其封闭范围(函数或 block )时分配,并在该范围退出时立即释放。具有已分配 存储持续时间的对象通过调用malloc/calloc/realloc 进行分配,并通过调用free 进行释放。我不会进入 thread local 因为它与这个讨论并不相关。

当你的程序被加载到内存中时,它的布局是这样的(假设是 x86 或类似的):

              +------------------------+
high address | Command line arguments |
| and environment vars |
+------------------------+
| stack | <-- str and her live here, but
| - - - - - - - - - - - | only for the duration of main()
| | |
| V |
| |
| ^ |
| | |
| - - - - - - - - - - - |
| heap |
+------------------------+
| global and read- | <-- "HelloMuraMana" lives here for
| only data | duration of the program
+------------------------+
| program text |
low address | (machine code) |
+------------------------+

具体情况取决于您的系统。请注意,这是在虚拟 地址空间而非物理内存中的样子。

当您的程序运行时,auto 变量(函数参数和局部于函数或 block 的变量,如 herstr)的存储是从标记为 stack 的区域分配。 allocated 对象的存储是从标记为heap 的区域分配的。

static 对象的存储以及 string literals(如 "HelloMuraMana")的存储来自不同的段;在上图中,它将是标记为 global and read-only data 的段。根据您的系统,字符串文字可能存储在只读段(例如 .rodata.rdata)中,也可能存储在可写段中。字符串文字应该是不可变的(因此称为“文字”),因此尝试修改字符串文字将导致未定义的行为。

在上面的布局中,全局数据对象的地址低于堆栈或堆对象,这在您的输出中显示。变量str是在你进入main时从栈中分配的;它的值是字符串文字的地址,它是程序第一次启动时从全局数据段分配的。

关于c - 单独声明和初始化的变量如何在内存中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45148734/

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