gpt4 book ai didi

c - C程序中的变量和调用及其在Linux进程地址空间中的对应位置

转载 作者:行者123 更新时间:2023-11-30 18:10:53 25 4
gpt4 key购买 nike

我目前正在学习 Linux 进程地址空间,但不确定这些 C 变量在进程地址空间中对应的位置。

我知道当调用一个函数时,会创建一个新框架,它将包含局部变量和其他函数调用等。

我不确定的是框架中的指针:

我有这个功能:

int main(){
char *pointer1 = NULL;
char *pointer2 = (void *)0xDDDDDDDD;
pointer1 = malloc(80);
strcpy(pointer1, "Testing..");
return(0);
}

当 main 被调用时,一个新的框架被创建。

变量已初始化。

我不确定这些是指针,在哪里:

  • *pointer1 对应于进程地址空间中的数据或文本部分?

  • *pointer2 对应于进程地址空间中的数据或文本部分?

  • NULL0xDDDDDDDD 属于数据部分还是文本部分?

  • 由于pointer1 = malloc(80),它属于堆栈部分吗?

最佳答案

首先应该注意的是,C 规范实际上并不要求局部变量存储在堆栈上,它根本没有指定自动变量的位置。

话虽如此,变量pointer1pointer2本身的存储很可能会被编译器放在堆栈上。当调用 main 函数时,它们的内存将成为编译器创建的堆栈框架的一部分。

继续说,在现代类似 PC 的系统上,指针实际上只不过是一个简单的无符号整数,它的值是它指向的地址。用于初始化的值(NULL0xDDDDDDDD)只是简单的整数值。初始化的完成方式与普通 int 变量相同。因此,用于初始化的值并不真正作为“数据”存在,而是可以直接在机器代码中进行编码,因此将存储在“文本”(代码)段中。

最后,对于动态分配,它不会改变 pointer1 的存储位置。它只是将一个新值分配给pointer1。被分配的内存位于“堆”上,它与任何程序段分开(即它不在代码、数据或堆栈段中)。

关于c - C程序中的变量和调用及其在Linux进程地址空间中的对应位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54145441/

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