2013-09-07 6 views
0

Код 1: предупреждение отсутствует. работа идеальный.const char ** и char **

#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: неисправности Segementation.

предупреждение: инициализации от несовместимого типа указателя [по умолчанию включено]

const char **p2p = &p; 
==> 
const char **p2p = &a; 

Проблема:

  1. Почему код 2 может работать, но код 3 получил ошибку segement?

2.При пропуск chat * в const char *, никакого предупреждения или ошибки не произошло, но когда я присваивание char ** к const char **, я получил предупреждение, почему?

ответ

3

Предположим

a[] = 0x100 - H e l l o w o r l d = 0x48 0x65 0x6c 0x6c ... 
p = 0x200 
p2p = 0x500 

Для 3 случая

p2p = &a 
p2p = 0x100 

и при попытке распечатать его с помощью *p2p вы пытаетесь *0x100 который читает память на адреса, хранящуюся в 0x100, который 0x4865 (предполагается, что 2 байт адрес и делать до конца). Адрес 0x4865, скорее всего, недопустим, и его чтение вызывает ошибку сегментации.

Для 2-го случая, его прямой вперед ...

p2p = &p 
p2p = 0x200 
*p2p = *0x200 = 0x100 

Смешение часть является то, что для адреса массива &a такой же, как a, который так же, как &a[0].

+0

+1. Не так смутно. C-стандарт хорошо ее охватывает в 6.2.5.20, а вторая половина [этого ответа] (http://stackoverflow.com/questions/13005070/in-c-the-name-of-an-array-is- an-pointer-to-its-first-element-isnt-it/13005613 # 13005613) бьет его до смерти. – WhozCraig

+0

@WhozCraig, да, но я думаю, что OP смущен тем, что, следовательно, получил этот вопрос. – Rohan

+0

Я полностью согласен, таким образом, «через некоторое время» и не прямо от ворот. – WhozCraig

Смежные вопросы