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

时间:2017-08-20 16:47:47

标签: c arrays string pointers char

我在帮助函数中传递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;




        }

1 个答案:

答案 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。

您应该仔细考虑如何在每行中填充变量。