2017-08-20 3 views
-1

Ich übergebe ein char * str [] in Hilfe-Funktion und dann Inhalte hinzufügen, aber in Hauptfunktion seine Werte unverändert sind.char * str [] übergeben als Referenz nicht funktioniert

Von Haupt Ich rufe letterCombinations Funktion und es ruft Hilfefunktion In Hilfe, die ich valuees von char * str bin der Bearbeitung [] wwhihc dort geändert werden, jedoch nicht in Buchstaben reflektiert Kombinationen funktionieren

Bitte helfen Sie mir, warum es funktioniert nicht

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]' deklariert ein Array von 100 Zeigern, von denen jeder ins Nirgendwo zeigt, da sie nicht initialisiert sind. Das ist kaum was du wolltest. – Aganju

+0

Ich reserviere Speicher in Hilfefunktion str [* k] = (char *) malloc (strlen (Ziffern) +1); – skag

+3

'return str;': 'str' ist eine lokale Variable. – BLUEPIXY

Antwort

1

Wenn Sie Ihren Code kompilieren, sollten Sie Warnungen sehen wie:

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

r Die Adresse der lokalen Variablen oder temporär ist die Warnung, die Ihr Verhalten erklärt.

In Ihrem Code:

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

Sie erstellen ein Array auf dem Stapel, str. Wenn Sie aus letterCombinations zurückkehren, wird die Variable nicht mehr verwendet und der Stapelspeicherplatz wird bereinigt. dh die von str verwendete Speicheradresse ist nicht mehr gültig.

Sie könnten ändern, damit der Aufrufer ihre eigene Variable char * übergibt, die dieses Problem beheben würde. Alternativ könnten Sie malloc str und dann, wenn Sie von der Funktion zurückkehren, der Speicherort noch vorhanden ist. Aber der Anrufer müsste den Speicherplatz freigeben - was unordentlich ist.

Nachdem Sie das behoben haben, gehen Sie zum nächsten Fehler über.

Das nächste, was ich ist bemerken, dass in der Hilfe-Funktion Sie haben:

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

aber curr initialisiert nicht. Fix das nächste. dann gehe zu deinem nächsten Fehler.

Sie sollten durch jede Zeile gehen, indem Sie überlegen, wie Ihre Variablen in jeder Zeile gefüllt werden.

+0

Ja, dass str Teil war falsch jetzt ich benutze char ** str = (char **) malloc (10000 * sizeof (char *)); – skag

Verwandte Themen