2015-12-14 2 views
0

Я написал небольшую консольную программу, которая хранит слова в массиве, представленные
char** test_tab, а затем распечатайте их.

Программа работает прекрасно, пока он не проходит через условную realloc()
(например, если я увеличить size к 1000).
Но если realloc() получится вызванным, программа выйдет из строя во время печати массива, возможно потому, что память там испортилась.Ошибка при выполнении из-за realloc

#include <stdio.h> 
#include <stddef.h> 
#include <stdlib.h> 

char* get_word(); 

int main(int argc, char* argv[]) 
{ 
    size_t size = 100; 
    size_t nb_pointer = 0; 
    char** test_tab = malloc(size * sizeof *test_tab); 
    char** temp_tab; 

    while((*(test_tab + nb_pointer) = get_word()) != NULL) 
    { 
     nb_pointer++; 
     if(nb_pointer >= size) 
     { 
      size += 100; 
      temp_tab = realloc(test_tab, size); 

      if(temp_tab != NULL) 
       test_tab = temp_tab; 
      else 
      { 
       free(test_tab); 
       exit(1); 
      } 
     } 
    } 

    for(nb_pointer = 0; *(test_tab + nb_pointer) != NULL; nb_pointer++) 
     printf("%s\n", *(test_tab + nb_pointer)); 

    free(test_tab); 

    return 0; 
} 

Может кто-то объясняет мне, что я делаю неправильно прямо здесь? Благодарю.

ответ

2

Объем памяти в realloc вычисляется неправильно.

 temp_tab = realloc(test_tab, size); 

должен быть

 temp_tab = realloc(test_tab, size * sizeof *test_tab); 
+1

Хорошо, я вижу , Я также изменил свой цикл, чтобы увеличить «nb_pointer» перед тестом 'nb_pointer> = size', иначе можно добавить строку без достаточного количества выделенной памяти. – aurelienC

0

Каждый раз, когда вы пытаетесь нажать одну строки и в то же время принимать все ранее толкаемую строку с вами. Теперь строка означает char * &, следовательно, вы должны использовать sizeof(char*) * size &, то вам нужно выделить память для строки снова, чтобы сохранить фактический характер .. Однако вы также можете подойти таким образом

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

static int size = 0; // static global means no risk while including this file 


char** push(char** memptr, char* data) { 
    size++; 
    if (size == 1) 
    memptr = (char**)malloc(size * sizeof(char*)); 
    else 
    memptr = (char**)realloc(memptr, size* sizeof(char*)); 

    memptr[size - 1] = (char*)malloc(sizeof(char) * strlen(data) + 1); 
    strncpy(memptr[size - 1], data, strlen(data)); 
    memptr[size - 1][strlen(data) -1] = '\0'; // over writing the `\n` from `fgets` 
    return memptr; 
} 


int main() { 
    char buf[1024]; 
    int i; 
    static char** memptr = NULL; 
    for (i = 0; i < 5; i++){ 
    fgets(buf, 1024, stdin); 
    memptr = push(memptr, buf); 
    } 

    for (i = 0; i < size; i++) 
    printf("%s\n", memptr[i]); 

    return 0; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^