我想按值传递char **指针。给出以下代码:
char **ptr;
void init(){
int i;
ptr = (char**)malloc(2 * sizeof(char*));
for(i=0;i<2;i++){
ptr[i]=(char*)malloc(3 * sizeof(char));
ptr[i] = ..//assign different strings of length 2
}
}
void swap(char **x, char **y) {
char *temp;
temp = *x;
*x = *y;
*y = temp;
}
void f(char **ptr1){
//swap the first and second element
swap(&ptr1[0],&ptr1[1]);
}
int main{
init();
f(ptr);
}
我用ptr调用函数f。我想保留ptr的第一个值,并希望使用ptr1作为它的副本。但是,在交换操作之后,ptr和ptr1都变得相同。 ptr改变了。我怎样才能按值传递它?
答案 0 :(得分:2)
你希望deep copy(而不是shallow copy)你的char **。当你打电话给f(ptr)时,就好像你在写
ptr1 = ptr; // by the way, why ptr is global?
这使得ptr1显然指向ptr指向的相同内存区域。 所以交换也影响了ptr并不奇怪。
如何解决?您必须逐个复制每个字符串。 您可以阅读this answer on SO以查找类似问题(它是C ++,但重点是相同的)。
<强> SUGGESTION 强> 如果可能,我建议
创建一个释放所有内存分配的函数(我猜你可能已经拥有了它)
这样你的f()函数将init()一个新的ptr1,将从ptr中取值来初始化ptr1的值,并调用成员的交换(更好的是,你可以直接初始化,甚至没有交换,只需使用适当的参数调用第3步中的函数。
答案 1 :(得分:0)
#include <stdlib.h>
#include <stdio.h>
char ** init()
{
char **ret;
ret = malloc(2 * sizeof *ret);
ret[0] = "world!" ;
ret[1] = "Hello " ;
return ret;
}
void swap(char **x, char **y)
{
char *temp;
temp = *x;
*x = *y;
*y = temp;
}
void f(char **ptr1)
{
//swap the first and second element
swap(&ptr1[0],&ptr1[1]);
}
int main(void) /* here! */
{
char **ptr;
ptr = init();
f(ptr);
printf("%s%s\n", ptr[0], ptr[1] );
return 0;
}