2014-01-14 4 views
0

У меня есть некоторые C код, который содержит массив текста, который я пытаюсь манипулировать следующим образом: -перераспределить вызывает ошибку GLibC для массива указателей

  • Выделяют массив указателей dictionary размера dictionary_size инициализируешься 50
  • Заменить все пробела и \ п с «\ 0»
  • магазин адрес каждой 3-й строки (разделенный неизвестным числом \ п-й или пространства) в dictionary
  • Если dictionary полон, г ealloc по размеру, dictionary_size * 2

Код однако, вызывает следующее сообщение об ошибке: -

*** glibc detected *** ./crack: realloc(): invalid next size: 0x0000000001386010 *** 
^Cmake: *** [run] Interrupt 

Код выглядит следующим образом: -

// Replace all spaces with '\0' 
    for (i = 0; i < file_size; i++) { 
    if (temp_buffer[i] == ' ' || temp_buffer[i] == '\n') { 
     while (temp_buffer[i] == ' ' || temp_buffer[i] == '\n') { 
     temp_buffer[i] = '\0'; 
     } 
     j++; 
    } 
    if ((j-1) % 3 == 0) { 
     dictionary[k] = temp_buffer+i; 
     k += 1; 
     if (k == dictionary_size) { 
     dictionary_size *= 2; 
     printf("Going to realloc to %d\n", dictionary_size); 
     dictionary = (char **)realloc(dictionary, dictionary_size); 
     } 
    } 
    } 

[EDIT] На основе отладки У меня есть, самый первый realloc (до размера 100) терпит неудачу.

+0

Наступает момент, когда вы больше не можете удвоить свое распределение ... видимо, распределение 19G больше, чем ваша система может поддерживать. Это не так удивительно, как вы сделали это так далеко в своем удвоении для начала. – mah

+0

Привет, я добавил редактирование, спасибо –

+0

Во-первых, был 'dictionary == NULL' или когда-либо установлен на основе возврата из' malloc() 'или это' realloc() 'первое, что вы когда-либо делали?Во-вторых, _invalid следующий размер: 0x0000000001386010_ предполагает, что размер не 100 ... вы подтвердили во время выполнения, что это то, что вы думаете, что это должно быть? – mah

ответ

2

dictionary_size - это элемент (указатель), а не размер распределения. должны быть dictionary_size * sizeof(char*)

dictionary = realloc(dictionary, dictionary_size * sizeof(*dictionary)); // safer, 10x @alk 

Или (менее recommneded):

dictionary = realloc(dictionary, dictionary_size * sizeof(char*));  // clearer 

Также проверьте, что dictionary_size правильно инициализирован.

+0

Хороший улов - 1+! Это подтверждает мой комментарий, что приведенные сообщения об ошибках указывают на внутреннюю ошибку в управлении памятью, поскольку из-за выделения в несколько случаев памяти, скорее всего, нераспределенная память была перезаписана. Лучшая коррекция (и заставка): 'dictionary = realloc (dictionary, dictionary_size * sizeof (* dictionary);' – alk

0

Вы выделяете слишком мало памяти. Ошибка вызвана ошибкой памяти (и вы никогда не узнаете, какая ошибка на самом деле выйдет из поврежденной памяти).

Если вы выделили dictionary_size байт, у вас есть место для указателей dictionary_size/sizeof(char *).

Ваш if заявление вместо этого предполагает, что вы считаете, что у вас есть место для указателей dictionary_size, что не так.

Изменение таНос/перераспределить на что-то вроде:

dictionary = (char **)realloc(dictionary, dictionary_size * sizeof(char *)); 

Кстати, вам не нужно отбрасывать возвращение перераспределить.

В качестве последнего предложения, учитывая, что realloc(NULL, ...) эквивалентно malloc(), это могло бы быть проще написать что-то вроде:

dictionary = NULL; 
... other code here ... 
    if (k >= dictionary_size) { 
    while (k >= dictionary_size) dictionary_size *= 2; 
    printf("Going to realloc to %d\n", dictionary_size); 
    dictionary = (char **)realloc(dictionary, dictionary_size * sizeof(char *)); 
    } 
    dictionary[k++] = temp_buffer+i; 
... etc ... 

Так что вы абсолютно уверены, что все k есть, у вас есть достаточно места для словаря [ к].

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