我有一个小程序,如下所示。这个程序试图更好地理解'C'中的指针如何在内存中排列变量。
#include <stdio.h>
const char *c = "hello";
const char **cp = &c;
const char ***cpp = &cp;
const char ****cppp = &cpp;
int main()
{
printf("PTR (c) : %p \n",c);
printf("PTR (cp) : %p \n",cp);
printf("PTR (cpp) : %p \n",cpp);
printf("PTR (cppp) : %p \n",cppp);
printf("CONTENT (c) : %c \n",*c);
printf("CONTENT (cp) : 0x%x \n",*(unsigned int*)cp);
printf("CONTENT (cpp) : 0x%x \n",*(unsigned int*)cpp);
printf("CONTENT (cppp): 0x%x \n",*(unsigned int*)cppp);
return 0;
}
我在电脑上的输出(Ubuntu 12.04)x86_64如下:
PTR (c) : 0x4006dc
PTR (cp) : 0x601020
PTR (cpp) : 0x601028
PTR (cppp) : 0x601030
CONTENT (c) : h
CONTENT (cp) : 0x4006dc
CONTENT (cpp) : 0x601020
CONTENT (cppp): 0x601028
自
以来输出看起来不错现在我对上述程序的二进制可执行文件执行了nm操作。
0000000000600e50 d _DYNAMIC
0000000000600fe8 d _GLOBAL_OFFSET_TABLE_
00000000004006d8 R _IO_stdin_used
w _Jv_RegisterClasses
0000000000600e30 d __CTOR_END__
0000000000600e28 d __CTOR_LIST__
0000000000600e40 D __DTOR_END__
0000000000600e38 d __DTOR_LIST__
0000000000400860 r __FRAME_END__
0000000000600e48 d __JCR_END__
0000000000600e48 d __JCR_LIST__
0000000000601040 A __bss_start
0000000000601010 D __data_start
0000000000400690 t __do_global_ctors_aux
0000000000400460 t __do_global_dtors_aux
0000000000601018 D __dso_handle
w __gmon_start__
0000000000600e24 d __init_array_end
0000000000600e24 d __init_array_start
0000000000400680 T __libc_csu_fini
00000000004005f0 T __libc_csu_init
U __libc_start_main@@GLIBC_2.2.5
0000000000601040 A _edata
0000000000601050 A _end
00000000004006c8 T _fini
00000000004003c8 T _init
0000000000400410 T _start
0000000000601020 D c
000000000040043c t call_gmon_start
0000000000601040 b completed.6531
0000000000601028 D cp
0000000000601030 D cpp
0000000000601038 D cppp
0000000000601010 W data_start
0000000000601048 b dtor_idx.6533
00000000004004d0 t frame_dummy
00000000004004f4 T main
U printf@@GLIBC_2.2.5
下面我重新介绍了相关的线索。
0000000000601020 D c
0000000000601028 D cp
0000000000601030 D cpp
0000000000601038 D cppp
据我所知,解释如下。
'c'是数据段的一部分(用'D'表示),地址为0000000000601020 根据我的程序,这是'cp'的地址。这是所有变量的情况。
我错过了一些重要的东西。初学者试图很好地理解C指针。
答案 0 :(得分:4)
'c'是数据段的一部分(用'D'表示),地址为0000000000601020根据我的程序,这是'cp'的地址。
实际上,当你打印时:
printf("PTR (cp) : %p \n",cp);
cp
的值,而不是cp
的地址。 cp
的值正好是c
的地址,因为cp
是指向c
的指针