代码1:没有警告,没有错误。工作完美。
#include <stdio.h>
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.当chat *
传递给const char *
时,没有发生任何警告或错误,但当我将char **
分配给const char **
时,我收到了警告,为什么?< / p>
答案 0 :(得分:3)
假设
a[] = 0x100 - H e l l o w o r l d = 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
令人困惑的部分是,数组地址&a
与a
相同,与&a[0]
相同。