如何按值传递char **指针?

时间:2011-11-27 14:17:06

标签: c string pointers pass-by-value

我想按值传递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改变了。我怎样才能按值传递它?

2 个答案:

答案 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 如果可能,我建议

  1. 摆脱全局指针
  2. 更改init以返回全局指针而不是void,以便它分配内存并返回指向它的指针
  3. 可能:创建一个不同的函数,该函数输入用于初始化char **的各种字符串(在您的示例中为两个)的值
  4. 创建一个释放所有内存分配的函数(我猜你可能已经拥有了它)

    这样你的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;
}