繁体   English   中英

const char **和char **

[英]const char ** and char **

代码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.当通过const char *传递chat * ,没有发生警告或错误,但是当我将char **分配给const char ** ,我得到了警告,为什么?

假设

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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM