C程序中的变量段?

问题描述 投票:1回答:1

每个表达式在哪里存储在内存中?常量变量将存储在哪里?

#include<stdio.h>

int a = 0;                   // initialized data segment
char arr[10] = "hello";      // initialized data segment
const int k = -1;            //
int* gptr = &a;              //

int main()
{
    const int m = 31;        //
    int n;                   //
    int* ptr;                //
    ptr = malloc(1024);      // heap segment

    char* ptr2 = &arr;       //

    for(n = 0; n<1024; ++n)  //
        printf("%d ", n);    //
}
c memory
1个回答
0
投票

变量m,n和ptr可能位于堆栈中(当我说指针指向堆栈时,它是&ptr指针本身的地址,但它指向的地址在堆中),但是如果要进行优化,可以将m,n和ptr变量放置在寄存器中(如果可用)。如果堆栈中有一个变量,您可以查看x86的ebp记录或x86-64的rbp记录是否根据数据类型的大小而收缩;例如,在体系结构x86-64 mov DWORD PTR [rbp-0x4],0x5中,如果在寄存器中,则int看起来像这样,不会因基指针寄存器中的值而减少

由于变量k为全局变量,并且其值无法更改,因此将其放置在.rodata段中,对具有内存保护功能的处理器有效。 gptr变量将放置在.data.rel.local线程中。当您执行char * ptr2时,将保留堆栈存储空间,该空间即为指针的大小,并在赋值中使用&arr将数据段中的数据复制到堆栈中。

我说的一切都适用于使用System V ABI的x86和x86-64处理器和操作系统

Ps:对不起,我的自然语言不是英语,可能会出现拼写错误

© www.soinside.com 2019 - 2024. All rights reserved.