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; 

问题:

  1. 为什么代码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地址&aa &a[0]