我目前正在学习 Linux 进程地址空间,但不确定这些 C 变量在进程地址空间中对应的位置。
我知道当调用一个函数时,会创建一个新框架,它将包含局部变量和其他函数调用等。
我不确定的是框架中的指针:
我有这个功能:
int main(){
char *pointer1 = NULL;
char *pointer2 = (void *)0xDDDDDDDD;
pointer1 = malloc(80);
strcpy(pointer1, "Testing..");
return(0);
}
当 main 被调用时,一个新的框架被创建。
变量已初始化。
我不确定这些是指针,在哪里:
*pointer1
对应于进程地址空间中的数据或文本部分?*pointer2
对应于进程地址空间中的数据或文本部分?NULL
和0xDDDDDDDD
属于数据部分还是文本部分?由于
pointer1 = malloc(80)
,它属于堆栈部分吗?
最佳答案
首先应该注意的是,C 规范实际上并不要求局部变量存储在堆栈上,它根本没有指定自动变量的位置。
话虽如此,变量pointer1
和pointer2
本身的存储很可能会被编译器放在堆栈上。当调用 main
函数时,它们的内存将成为编译器创建的堆栈框架的一部分。
继续说,在现代类似 PC 的系统上,指针实际上只不过是一个简单的无符号整数,它的值是它指向的地址。用于初始化的值(NULL
和 0xDDDDDDDD
)只是简单的整数值。初始化的完成方式与普通 int
变量相同。因此,用于初始化的值并不真正作为“数据”存在,而是可以直接在机器代码中进行编码,因此将存储在“文本”(代码)段中。
最后,对于动态分配,它不会改变 pointer1
的存储位置。它只是将一个新值分配给pointer1
。被分配的内存位于“堆”上,它与任何程序段分开(即它不在代码、数据或堆栈段中)。
关于c - C程序中的变量和调用及其在Linux进程地址空间中的对应位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54145441/