2012-09-16 55 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

感谢您的解释 –