1

代码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;

问题:

  1. 为什么代码 2 可以工作,但代码 3 出现段错误?

2.当传递chat *到时const char *,没有警告或错误发生,但是当我分配 char **到时const char **,我得到了警告,为什么?

4

1 回答 1

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

令人困惑的部分是数组地址&aa相同&a[0]

于 2013-09-07T10:00:17.050 回答