如何通过值传递char**指针?
我想通过值传递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 **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;
}