2017-08-20 64 views
-1

我在幫助函數中傳遞一個char * str [],然後向其中添加內容,但在主函數中它的值保持不變。char * str []通過引用不起作用

從主我打電話letterCombinations功能,它調用幫助功能 在幫助我編輯wwhihc改變有,但沒有反映的char * STR [1]的valuees在字母組合功能

請幫我爲什麼它不工作

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

'char * str [100]'聲明一個100個指針的數組,每個指針都指向無處,因爲它們沒有被初始化。這不是你想要的。 – Aganju

+0

我在幫助函數str [* k] =(char *)malloc(strlen(digits)+1)中分配內存; – skag

+3

'return str;':'str'是局部變量。 – BLUEPIXY

回答

1

如果您編譯代碼,你會看到這樣的警示:

warning C4172: returning address of local variable or temporary 
warning C4100: 'returnSize' : unreferenced formal parameter 

[R局部變量或臨時地址的刻意地址是解釋你行爲的警告。

在您的代碼:

char** letterCombinations(char* digits, int* returnSize) { 
    char *str[100]; 
    ... 
    return str; 
} 

您在棧上創建一個數組,海峽。從letterCombinations返回時,變量超出範圍,並且堆棧內存位置得到清理。即str使用的內存地址不再有效。

你可以改變,讓調用者通過自己的char *變量來解決這個問題。或者,您可以使用malloc str,然後當您從函數返回時,內存位置仍然存在。但是來電者將不得不釋放存儲位置 - 這很麻煩。

修復之後...然後進入下一個錯誤。

我注意到的下一件事情是,在幫助功能您有:

if (strlen(curr) == strlen(digits)) 

但CURR將不會被初始化。修復下一個。然後轉到你的下一個bug。

你應該仔細研究每一行,思考如何在每行中填充變量。

+0

是的,現在我使用的字符部分是錯誤的char ** str =(char **)malloc(10000 * sizeof(char *)); – skag