2016-04-08 2 views
-2

Этот код должен сохранять друзей в каком-либо массиве массива (указатель на указатель) и по длине имен делать realloc (строить точно динамическое место для строк каждого из них), а также печатает строку и длину и освобождает все. Итак, код работает, когда я отлаживаю, но когда я запускаю его с CTR + f5, он разбивается после fgets первой строки. также все свободные циклы и бесплатная функция не работают здесь, но если удалить ее, то отладка все еще работает, а CTR + f5 все равно не работает. Помогите кому-нибудь?Работа кода при отладке, но при запуске кода сбой

#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

Почему * (friendBook + i), а не friendBook [i]? – gnasher729

+2

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

+0

@BLUEPIXY спасибо! теперь это работа! – blackFish

ответ

1

Возьмите строку «Привет». strlen («Hello») = 5. Но для его сохранения вам нужны SIX байты, а не пять, потому что в конце есть нулевой байт, который не подсчитывается strlen.

PS. Неопределенное поведение при попытке печати strlen в формате% d. Может рухнуть, печатать глупости или, что еще хуже. Используйте% zd. Включите все предупреждения в своем компиляторе и исправьте их.

PS. BLUEPIXY обнаружил гораздо худшую проблему ...