如何通过值传递char**指针?

如何通过值传递char**指针?,c,string,pointers,pass-by-value,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 } } v

我想通过值传递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);
}
char**ptr;
void init(){
int i;
ptr=(char**)malloc(2*sizeof(char*);
对于(i=0;i您想要(而不是)您的char**。当您调用f(ptr)时,就像您正在编写

ptr1 = ptr; // by the way, why ptr is global?
这表明ptr1指向的是ptr指向的内存区域。 因此,互换也会影响ptr,这并不奇怪

如何修复?您必须逐个复制每个字符串。 您可以阅读类似的问题(它是C++,但点是相同的)。 建议 如果可能的话,我建议

  • 去掉全局指针

  • 更改init以返回全局指针而不是void,以便它分配内存并返回指向它的指针

  • 可能:创建一个不同的函数,该函数接受用于初始化char的各种字符串(示例中有两个)的输入值**

  • 创建一个释放所有分配内存的函数(我想您可能已经拥有了它)

    因此,您的f()函数将初始化()一个新的ptr1,将从ptr获取值以初始化ptr1的值,并将调用成员上的交换(更好的是,您可以直接初始化,甚至不需要交换,只需在步骤3使用适当的参数调用函数即可)

  • #包括
    #包括
    字符**init()
    {
    字符**ret;
    ret=malloc(2*sizeof*ret);
    ret[0]=“世界!”;
    ret[1]=“你好”;
    返回ret;
    }
    无效交换(字符**x,字符**y)
    {
    字符*温度;
    温度=*x;
    *x=*y;
    *y=温度;
    }
    空f(字符**ptr1)
    {
    //交换第一个和第二个元素
    交换(&ptr1[0]、&ptr1[1]);
    }
    int main(void)/*此处*/
    {
    字符**ptr;
    ptr=init();
    f(ptr);
    printf(“%s%s\n”,ptr[0],ptr[1]);
    返回0;
    }
    
    为什么在循环中分配给
    ptr[i]
    两次?覆盖
    malloc
    的返回值。此外,调用
    init
    的位置在哪里?好的,我编辑了。但是对于每个字符串,我还需要占用内存。您所说的“交换操作后,ptr和ptr1变得相同”是什么意思?当您从
    f
    返回时,
    ptr1
    变量在交换后立即消失。当然,
    ptr1
    ptr
    具有相同的值;这是您调用
    f
    时传递给它的值。当我从f返回时,ptr1消失,但ptr也会更改。但我只想保留原始值并发送ptr的一个副本。是的,这就是原因,但我正在尝试在不进行深度复制的情况下找到一个解决方案。但是在f()函数中,您没有malloc'新内存。您必须复制在init()中执行的操作函数,即为char**指向的每个char*重新保留新内存。保留内存分配计数:您只为ptr而不是为ptr1进行分配。您确定结果是@thetux4所期望的吗?重点是不修改第一个指针ptr,而只修改“copy”ptr1,你展示的代码正在修改ptr。也许我理解他错了。但是他当然可以创建一个双成员数组的副本并修改副本。
    #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;
    }