我写了以下C程序。
int main() {
int i = 3;
char *q = "hello";
char *p = NULL;
return 0;
}
当我使用gdb编译和调试它时,我得到以下注册信息..
gcc main.c -g
gdb a.out
info reg:
cs 0x33 51
ss 0x2b 43
ds 0x0 0
我的问题是如果ds
为0,整数i
和char* q
如何获取其实际地址?
答案 0 :(得分:1)
这是编译器相关的。数据段是程序虚拟地址空间的一部分,它包含由程序员初始化的全局变量和静态变量。默认情况下初始化为零的全局和静态分配数据在所谓的进程的BSS区域。堆是动态内存(由malloc(),calloc(),realloc()和new - C ++获得)的地方。 。堆栈段是分配本地(自动)变量的位置。所以我,p和q存储在堆栈段中。代码段包含已编译的程序。 RO(只读)段包含常量字符串,如“Hello”
答案 1 :(得分:0)
这里我和q是主函数堆栈的一部分。编译后,它们可归结为堆栈中的地址。因此,它们不会成为数据部分的一部分。