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

标签 c linux linux-kernel

我目前正在学习 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/

相关文章:

linux - 以编程方式读取linux内核参数

linux - Linux 启动内存初始化中令人困惑的事情

linux - 如何在 Linux 4.20.11 上作为 Dom0 在arm64和Qemu 6.0.0上运行XEN

c - 解析后的符号表总体;编译器构建

c - 如何用c语言构建左半角金字塔

c - 非阻塞并行 FIFO

php - UTF-8贯穿始终

linux - 一个多线程进程的线程ID可以和另一个正在运行的进程的进程ID相同吗?

c - Visual Studio 在 C 函数的参数前面列出参数名称

c - typedef 的指针类型错误