2016-09-25 63 views
0

的指針和級聯我得到兩個字符串的連接時的「C」被打印在function.But內時,返回指針的地址和「i」被印刷內部主,輸出不正確。傳字符陣列的串

#include <stdio.h> 

char* comp(char* s,char* t) 
{ 
int count=0; 
char *c; 
c=s; 
while(*s!='\0') 
    s++; 
for(;*t!='\0';t++,s++) 
    *s=*t; 
return c; 
} 

int main(){ 
char* i; 
char c[]= "hello there"; 
char f[]="world"; 
i=comp(&c,&f); 
printf("%s",i); 
return 0; 
} 
+2

可能重複的[如何在C中打印內存地址](http://stackoverflow.com/questions/30354097/how-to-printf-a-memory-address-in-c) – wasthishelpful

+1

要清楚,你*不是*「返回指針變量的地址」。如果你這樣做了,你會做'return&c',你(幸好)不這樣做。你只是簡單地返回一個指針。此外,您正在用錯誤的參數調用該函數。不要在調用中使用的地址的操作,你只需要把這個數組作爲是和編譯器將其衰減到指針到他們的第一要素。對於例如數組'f'表達式'f'和'&f [0]'是相同的。這裏的表達式&f實際上是錯誤的。 –

+0

你試圖將數據追加到一個最有可能只讀存儲器位置。即使它不是隻讀的,你仍然要經過分配的內存,這是未定義的行爲。當存在未定義的行爲時,你不會問「爲什麼」。 –

回答

3

問題,我看到:

問題1

你是不是空在comp終止連接字符串。

char* comp(char* s,char* t) 
{ 
    int count=0; 
    char *c; 
    c=s; 
    while(*s!='\0') 
     s++; 
    for(;*t!='\0';t++,s++) 
     *s=*t; 

    // Need this 
    *s = '\0'; 
    return c; 
} 

問題2

您錯誤地調用該函數。您需要使用:

i=comp(c, f); // Not comp(&c, &f) 

問題3

最嚴重的問題是,你寫了記憶,你不應該:

當你使用:

char c[]= "hello there"; 
char f[]="world"; 

c有足夠的內存來存放字符串"hello there"f有足夠的內存容納字符串"world"。試圖超出這些限制是因爲未定義的行爲。你可以使用:

char c[100]= "hello there"; 
char f[]="world"; 
i = comp(c, f); 

這將是確定,因爲c具有保持連接字符串足夠的空間。

更新,響應OP的評論

char c[]= "hello there"; 

等同於:

char c[12] = {'h', 'e', 'l', 'l', 'o', ' ', 't', 'h', 'e', 'r', 'e', '\0'}; 

追加"world"到相當於執行以下操作:

c[11] = 'w'; 
c[12] = 'o'; 
c[13] = 'r'; 
c[14] = 'l'; 
c[15] = 'd'; 
c[16] = '\0'; 

那導致未定義的行爲或者因爲您正在使用越界索引編寫數組元素。即使使用出界索引來訪問數組的元素也會導致定義的行爲。

+0

謝謝!但是,你能否詳細解釋一下問題3。我對c中的內存管理沒有太多的想法,但我真的很想學習。 –