2016-04-08 12 views
-2

Dieser Code muss Freunde in einigen Array-Array (Zeiger auf Zeiger) und durch die Länge der Namen Realloc (bauen Sie genau dynamische Ort für die Strings von jedem speichern von ihnen) und dann druckt die Schnur und die Länge und befreit alles. So funktioniert der Code beim Debuggen, aber wenn ich ihn mit CTR + f5 starte, ist er nach den Fgets der ersten Zeichenfolge abgestürzt. auch alle free loops und die free-funktion funktionieren mir hier nicht, aber wenn es entfernt wird funktioniert das debuggen immer noch und die CTR + f5 funktionieren immer noch nicht. jemandem helfen?Code funktioniert beim Debuggen, aber wenn es den Code abgestürzt

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define LENGTH 20 

int main(void) 
{ 
    int i = 0, j = 0,friends=0; 
    char str[LENGTH]; 
    printf("Hello bro,how U doin'?\nTell me how many friends do you have?\n"); 
    scanf("%d",&friends); 
    char** friendBook = (char**)malloc(sizeof(char)*friends); 
    if (friendBook) 
    { 
     getchar(); 
     for (i = 0; i < friends; i++) 
     { 
      *(friendBook+ i) = malloc(LENGTH*sizeof(char)); 
     } 
     for (i = 0; i < friends; i++) 
     { 
      printf("Enter friend number: %d\n", i + 1); 
      fgets(str, LENGTH, stdin); 
      str[strcspn(str, "\n")] = 0; 
      *(friendBook + i) = (char*)realloc(*(friendBook+i),(sizeof(char)*strlen(str)));  // dynamic memory for every string(name) 
      if (*(friendBook + i)) 
      { 
       strcpy(*(friendBook+i),str); 
      } 
     } 
     for (i = 0; i < friends; i++) 
     { 

      printf("Friend: %s\tLength of friend name %d\n", *(friendBook + i), strlen(*(friendBook + i))); 
     } 
    } 
    for (i = 0; i <friends; i++) 
    { 
     free(*(friendBook+i)); 
    } 
    free(friendBook); 
    system("PAUSE"); 
    return 0; 
} 
+0

Warum * (friendBook + i) und nicht friendBook [i]? – gnasher729

+2

'char ** friendBook = (char **) malloc (sizeof (char) * freunde);' -> 'char ** friendBook = (char **) malloc (sizeof (char *) * freunde);' – BLUEPIXY

+0

@BLUEPIXY danke! jetzt ist es Arbeit! – blackFish

Antwort

1

Nehmen Sie die Zeichenfolge "Hallo". strlen ("Hello") = 5. Aber um es zu speichern, brauchst du SIX-Bytes, nicht fünf, weil es am Ende ein Null-Byte gibt, das von strlen nicht gezählt wird.

PS. Undefiniertes Verhalten, wenn Sie versuchen, strlen mit% d Format zu drucken. Kann abstürzen, Unsinn oder schlimmer ausdrucken. Verwende% zd. Aktivieren Sie alle Warnungen in Ihrem Compiler und beheben Sie sie.

PS. BLUEPIXY entdeckte ein viel schlimmeres Problem ...

Verwandte Themen