C 为什么数据段(ds)为0?事件存在另一个法定变量(整数)
我编写了下面的C程序C 为什么数据段(ds)为0?事件存在另一个法定变量(整数),c,linux,null,C,Linux,Null,我编写了下面的C程序 int main() { int i = 3; char *q = "hello"; char *p = NULL; return 0; } 当我用gdb编译和调试它时,我得到以下reg信息 gcc main.c -g gdb a.out info reg: cs 0x33 51 ss 0x2b 43 ds 0x0 0 我的问题是,如果ds为0,integeri和char*q如何获得它们的物理地址 这取决于编译器。数据段是程序虚拟地
int main() {
int i = 3;
char *q = "hello";
char *p = NULL;
return 0;
}
当我用gdb编译和调试它时,我得到以下reg信息
gcc main.c -g
gdb a.out
info reg:
cs 0x33 51
ss 0x2b 43
ds 0x0 0
我的问题是,如果
ds
为0,integeri
和char*q
如何获得它们的物理地址 这取决于编译器。数据段是程序虚拟地址空间的一部分,其中包含由程序员初始化的全局变量和静态变量。默认情况下初始化为零的全局和静态分配数据保存在进程的BSS区域中。堆是动态内存(由malloc()、calloc()、realloc()和new–C++获得)的来源。堆栈段是分配本地(自动)变量的位置。所以i、p和q存储在堆栈段中。代码段包含编译程序。RO(只读)段包含常量字符串,如“Hello”此处i和q是主函数堆栈的一部分。编译后,它们归结为堆栈上的地址。因此,它们不会成为数据段的一部分。这是64位机器上的吗?x86-64忽略了大部分分段,因此允许ds为0。在Linux上,i和q实际上没有物理地址(在应用程序级别),只有虚拟地址。阅读有关进程和地址空间的更多信息,例如