2016-04-08 70 views
-2

Bu kod, dizinin bir dizi dizisine (işaretçiye gösterici) ve adların uzunluğuna göre realloc kaydetmelidir (her bir dizenin tam dinamik yerini oluşturun) onların) ve dize ve uzunluğu basar ve her şeyi özgür bırakır. Yani kod hata ayıklama yaparken çalışır, ancak CTR + f5 ile çalıştırdığımda ilk dizenin fidyelerinden sonra çöker. Ayrıca, tüm ücretsiz döngüler ve ücretsiz işlev beni burada çalışmıyor, ancak çıkarsa hata ayıklama hala çalışıyor ve CTR + f5 hala çalışmıyor. birine yardım et?Kod hata ayıklama yaparken çalışır, ancak kod çalıştırıldığında kilitlendi

#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

Neden * (friendBook + i) ve arkadaş değil [i]? – gnasher729

+2

'char ** friendBook = (char **) malloc (sizeof (char) * arkadaşlar);' -> 'char ** friendBook = (char **) malloc (sizeof (char *) * arkadaşlar); – BLUEPIXY

+0

@BLUEPIXY teşekkürler! şimdi çalışıyor! – blackFish

cevap

1

"Hello" dizesini alın. strlen ("Merhaba") = 5. Ancak saklamak için, beşte değil SIX baytına ihtiyacınız var, çünkü sonuçta strlen tarafından sayılmayan sıfır bayt var.

PS. Strlen'i% d formatıyla yazdırmaya çalıştığınızda tanımlanmamış davranış. Kaza yapabilir, anlamsız veya daha kötü yazdırılabilir. % Zd kullanın. Tüm uyarıları derleyicinizde açın ve düzeltin.

PS. BLUEPIXY çok daha kötü bir problem tespit etti ...