2012-09-16 102 views
0

我有以下代碼:更改內存地址*

str = "ABCD"; //0x001135F8 
newStr = "EFGH"; //0x008F5740 

*str在第5位的realloc後 - //0x001135FC
我希望它指向:0x008F5740

void str_cat(char** str, char* newStr) 
{ 
int i; 
realloc(*str, strlen(*str) + strlen(newStr) + 1); //*str is now 9 length long 
// I want to change the memory reference value of the 5th char in *str to point to newStr. 
// Is this possible? 
// &((*str) + strlen(*str)) = (char*)&newStr; //This is my problem (I think) 
} 
+0

你究竟想達到什麼目的?您可以將指針更改爲指向任意內存位置,但不能將一個指針指向兩個位置或不連續的內存塊。 – DCoder

+0

我不想指向2個地方。我想指向一個非連續的塊(char數組中的第5個位置將指向內存中的不同位置)。這不可能? –

+0

不,這是不可能的。 c中的字符串是char的CONTINUOS數組,它以0結尾 - 還有其他字符串實現,它本身表示一個字符串(通常是一個很長的字符串)作爲內部字符串列表,但通常用於特殊用途 –

回答

0
void str_cat(char* dest, char* src) 
{ 
    dest = realloc(dest, strlen(dest) + strlen(src) + 1); 

    strcpy(dest + strlen(dest), src); 
} 

應該可以工作 - 雖然我手邊沒有編譯器來測試

,甚至更快,幾乎沒有指針:http://www.koders.com/c/fid359660C181A42919DCB9E92C1406B7D16F27BB8D.aspx

+1

你應該返回'dest'。 –

+0

是啊,但由於OP沒有這樣做..但我同意! –

+0

,還應該添加一些安全檢查,如計算var中所需的內存,然後使用strncpy ... –

1

你似乎混淆一些有關C.很重要的指針是隻是在內存中的地址。這是在街上住的地址。假設我喜歡在K街409號。然後有人去噴塗油漆「D」在409,「E」在410,「A」在411,和「D」在412.然後有人去噴塗油漆「B」在202 M Street,「E」在203,「E」在204,「F」在205.是否有任何意義,你可以去說「嘿,現在413 K街現在和202 M街一樣?」不,它不是!相反,你必須找到一堆還沒有被繪的房屋,並在其中的八個寫上「DEADBEEF」。

通過類推,在C中,您將爲零終止符分配一個新字符串,其長度爲兩個字符串的長度加1,然後將第一個字符串複製到前四個位置,並將下一個字符串複製到餘數。

+0

感謝您的解釋 –