const char **和char **
代码1:没有警告,没有错误。 工作完美。
#include void printP(const char *p) { printf("const char *p is : %p\n",p); if( p ) printf("%s\n",p); } void printP2P(const char **p) { printf("const char **p pointer to : %p\n",*p); if( p &&(*p) ) printf("%s\n",*p); } int main() { char a[] = "Hello World"; const char *p = a; const char **p2p = &p; printP(p); printP2P(p2p); return 0; }
代码2:可以工作。
警告:从不兼容的指针类型初始化[默认启用]
const char *p = a; ==> char *p = a;
代码3:分段错误。
警告:从不兼容的指针类型初始化[默认启用]
const char **p2p = &p; ==> const char **p2p = &a;
问题:
- 为什么代码2可以工作,但代码3出现了一个segement错误?
2.当传递chat *
到const char *
,没有发生警告或错误,但是当我将char **
分配给const char **
,我收到了警告,为什么?
假设
a[] = 0x100 - H elloworld = 0x48 0x65 0x6c 0x6c ... p = 0x200 p2p = 0x500
第三种情况
p2p = &a p2p = 0x100
当你尝试使用*p2p
打印它时,你正在尝试*0x100
,它正在读取存储在0x100
地址的内存,即0x4865
(假设有2个字节的地址并且消除了字节顺序)。 地址0x4865
最有可能无效并且读取它会导致分段错误。
对于第二种情况,它直截了当……
p2p = &p p2p = 0x200 *p2p = *0x200 = 0x100
令人困惑的部分是arrays地址&a
与a
&a[0]
。