Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么数据段(ds)为0?事件存在另一个法定变量(整数)_C_Linux_Null - Fatal编程技术网

C 为什么数据段(ds)为0?事件存在另一个法定变量(整数)

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如何获得它们的物理地址 这取决于编译器。数据段是程序虚拟地

我编写了下面的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,integer
i
char*q
如何获得它们的物理地址

这取决于编译器。数据段是程序虚拟地址空间的一部分,其中包含由程序员初始化的全局变量和静态变量。默认情况下初始化为零的全局和静态分配数据保存在进程的BSS区域中。堆是动态内存(由malloc()、calloc()、realloc()和new–C++获得)的来源。堆栈段是分配本地(自动)变量的位置。所以i、p和q存储在堆栈段中。代码段包含编译程序。RO(只读)段包含常量字符串,如“Hello”

此处i和q是主函数堆栈的一部分。编译后,它们归结为堆栈上的地址。因此,它们不会成为数据段的一部分。

这是64位机器上的吗?x86-64忽略了大部分分段,因此允许ds为0。在Linux上,i和q实际上没有物理地址(在应用程序级别),只有虚拟地址。阅读有关进程和地址空间的更多信息,例如