char*str[]按引用传递不起作用
我正在帮助函数中传递一个char*str[],然后向其中添加内容,但在主函数中其值不变 我从main调用lettercompositions函数,它调用help函数 在“帮助”中,我正在编辑char*str[]wwhich的值,这些值在那里发生了更改,但没有反映在字母组合函数中 请帮帮我为什么它不起作用char*str[]按引用传递不起作用,c,arrays,string,pointers,char,C,Arrays,String,Pointers,Char,我正在帮助函数中传递一个char*str[],然后向其中添加内容,但在主函数中其值不变 我从main调用lettercompositions函数,它调用help函数 在“帮助”中,我正在编辑char*str[]wwhich的值,这些值在那里发生了更改,但没有反映在字母组合函数中 请帮帮我为什么它不起作用 help(char *str[],char* curr,int index,char* digits,char** a,int *k) { if(strl
help(char *str[],char* curr,int index,char* digits,char** a,int *k)
{
if(strlen(curr)==strlen(digits))
{
printf("%d",*k);
str[*k]=(char*)malloc(strlen(digits)+1);
str[*k]=curr;
printf("%s %s %d\n",curr,str[*k],*k);
*k=*k+1;
return ;
}
int i;
char* loop=a[digits[index]-'0'];
int l=strlen(loop);
for(i=0;i<l;i++)
{
curr[index]=loop[i];
help(str,curr,index+1,digits,a,k);
curr[index]='\0';
}
}
char** letterCombinations(char* digits, int* returnSize) {
char *str[100];
int i=0;
char* curr=malloc(sizeof(strlen(digits)+1));
char** a=(char**)malloc(10*sizeof(char*));
int siz=0;
a[0]="";
a[1]="";
a[2]="abc";
a[3]="def";
a[4]="ghi";
a[5]="jkl";
a[6]="mno";
a[7]="pqrs";
a[8]="tuv";
a[9]="wxyz";
help(str, curr, 0, digits,a,&siz);
printf(" %d",siz);
for(i=0;i<siz;i++)
{
printf(" s %s",str[i]);
}
// *returnSize=siz;
return str;
}
help(char*str[],char*curr,int-index,char*digits,char**a,int*k)
{
如果(strlen(curr)=strlen(数字))
{
printf(“%d”,*k);
str[*k]=(char*)malloc(strlen(数字)+1);
str[*k]=curr;
printf(“%s%s%d\n”,curr,str[*k],*k);
*k=*k+1;
返回;
}
int i;
char*loop=a[数字[索引]-'0'];
int l=strlen(循环);
对于(i=0;i如果编译代码,您应该会看到以下警告:
warning C4172: returning address of local variable or temporary
warning C4100: 'returnSize' : unreferenced formal parameter
局部变量或临时变量的返回地址是解释您行为的警告
在代码中:
char** letterCombinations(char* digits, int* returnSize) {
char *str[100];
...
return str;
}
您在堆栈上创建了一个数组str。当您从字母组合返回时,变量超出范围,堆栈内存位置被清除。即str使用的内存地址不再有效
您可以进行更改,以便调用者传入他们自己的char*变量,这将解决此问题。或者,您可以使用malloc str,然后当您从函数返回时,内存位置仍然存在。但是调用者必须释放内存位置-这很乱
修复后…然后转到下一个bug
我注意到的下一件事是,在帮助功能中,您有:
if (strlen(curr) == strlen(digits))
但是curr并没有初始化。下一步修复它。然后继续下一个bug
您应该一步一步地浏览每一行,思考如何在每一行中填充变量。char*str[100]
声明了一个由100个指针组成的数组,每个指针都不指向任何地方,因为它们没有初始化。这很难满足您的要求。返回str;
:str
是局部变量。Skag,好的,但是在malloc
后面的一行中,您用curr
覆盖指向内存的指针,因此它丢失了。之后,您就可以使用当你认为你在改变str[*k]时改变curr。也许你的意思是strcpy(str[*k],curr)
there?@skag在malloc之后,当你做str[*k]=curr
时,它不是把字符串分配给那个动态内存块。它是在做str[*k]
指向curr
,动态内存块从未被使用过,导致泄漏。您必须使用strcpy
或更好的strncpy
将字符串从curr
复制到str[*k]
strcpy
如果你小心你的字符串长度,它会起作用。我推荐strncpy
,因为它限制了被复制的字符数量。是的,str部分是错误的,我现在使用char**str=(char**)malloc(10000*sizeof(char*);