2014-02-22 140 views
0

的存儲位置,我有計劃更改常量指針

void alloc(char **p) 
{ 
    *p=(char*)malloc(sizeof(char)*3); 
     (*p)[0]='a'; 
    (*p)[1]='f'; 
    (*p)[2]='\0'; 

} 
main() 
{ 
    char p[]="hrrgr"; 
    alloc(&p); 

    printf("%s",p); 
} 

不打印輸出。請解釋一下。 我通過傳遞char * p知道;和alloc(& p)將會訣竅。但我的問題的目的是瞭解我得到的輸出。

+2

在某些情況下將數組衰減爲指針,但這不是這些情況之一。改用char *。 – Bathsheba

+0

我假設你看到了來自編譯器的警告,你正在傳遞'char(*)[]'作爲期望char **的參數? – lurker

回答

2

p是一個由6個字符組成的數組。因此pchar[6]類型。 &p則是類型pointer to char[6] type,即char (*)[6]。當你將一個數組傳遞給一個函數時,它會計算一個指向它的第一個元素的指針。因此,當您將char (*)[6]類型值傳遞給您的alloc函數時,您正在將char (*)[6]類型分配給char **類型。它們是不兼容的類型,並有不同的指針算術。你不能使char (*)[6]的行爲類似char **類型,即使通過只會抑制編譯器警告的類型轉換。

1

&p屬於char (*)[6]類型,但函數alloc預計類型爲char **的參數。您傳遞錯誤的類型參數。

2

這是不允許的:p是一個6個字符的數組,而不是一個char指針。您不應將&p指定爲char**指針。

如果你想解決這個問題的代碼,聲明pchar*,而不是作爲一個數組:

char *p="hrrgr"; 
alloc(&p); 

Running demo on ideone.

+0

'p'是一個由'6'字符組成的數組。 – haccks

+0

@haccks你是對的,我的計數是一個。謝謝! – dasblinkenlight

+0

嘗試更改由'p'指向的字符串將導致未定義的行爲。 – ajay

0

試試這個...

void alloc(char **p) 
{ 
    *p=(char*)malloc(sizeof(char)*3); 
    (*p)[0]='a'; 
    (*p)[1]='f'; 
    (*p)[2]='\0'; 
} 
main() 
{ 
    char *p; 
    alloc(&p); 
    printf("%s",p); 
} 

當過聲明一個數組然後會有連續的內存分配,但是在這裏你正在改變開始3個元素的內存,這改變了數組a的整個位置nd打印垃圾...