我在帮助函数中传递char * str [],然后向其中添加内容,但在main函数中,它的值不变。
从主要我调用letterCombinations函数,它调用帮助函数 在帮助我编辑char * str []的价值wwhihc在那里改变但没有反映在字母组合功能
请帮助我,为什么它不起作用
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;
}
答案 0 :(得分:1)
如果您编译代码,您应该看到警告,例如:
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。从letterCombinations返回时,变量超出范围,堆栈内存位置被清除。即str使用的内存地址不再有效。
你可以改变,以便调用者传入他们自己的char *变量,这将解决这个问题。或者,你可以使用malloc str,然后当你从函数返回时,内存位置仍然存在。但调用者必须释放内存位置 - 这很麻烦。
修好后...然后转到下一个bug。
接下来我注意到在帮助功能中你有:
if (strlen(curr) == strlen(digits))
但是curr没有初始化。修复下一步。然后转到你的下一个bug。
您应该仔细考虑如何在每行中填充变量。