char*str[]按引用传递不起作用

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

我正在帮助函数中传递一个char*str[],然后向其中添加内容,但在主函数中其值不变

我从main调用lettercompositions函数,它调用help函数 在“帮助”中,我正在编辑char*str[]wwhich的值,这些值在那里发生了更改,但没有反映在字母组合函数中

请帮帮我为什么它不起作用

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*);