每个表达式在哪里存储在内存中?常量变量将存储在哪里?
#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); //
}
变量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:对不起,我的自然语言不是英语,可能会出现拼写错误