2013-11-30 6 views
1

Я хочу динамически распределять массив 2D-диаграммы. Здесь я пытаюсь сделать это в цикле, но он вызывает ошибку сегментации. Если я удалю "arr [length] = str;" все будет хорошо. Но я не хочу этого делать.Динамический 2D-массив символов

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

int main(void) { 
    char** arr; 
    int i = 0; 
    int length = 0; 
    for(i = 0; i < 4; i ++) { 
     arr = (char**) realloc(arr, (length+1) * sizeof(char*)); 
     char* str = (char*) malloc(4 * sizeof(char)); 
     arr[length] = str; 
    } 

    return 0; 
} 
+0

Используйте отладчик, чтобы узнать больше о проблеме. – suspectus

+0

Вы пытались установить 'arr' в' NULL' перед циклом? – Cyclonecode

+0

Вы никогда не увеличиваете 'length'. –

ответ

0

Вы используете перераспределить на arr, но вы никогда не выделено место для него. Используйте таНос

+1

'realloc' должен вести себя просто например 'malloc', если вы передадите нулевой указатель. – Cyclonecode

3

Вы можете делать то, что сказал Гвидо, но вместо этого можно также установить первоначально

char** arr = NULL; 

, потому что, когда перераспределить получает указатель NULL в качестве входных данных он ведет себя как таНос.

Также цикл я предполагаю, что должен быть

for(i = 0; i < 4; i ++) { 
    arr = (char**) realloc(arr, (length+1) * sizeof(char*)); 
    char* str = (char*) malloc(4 * sizeof(char)); 
    arr[length++] = str; 
} 

Обратите внимание на длину ++.

0

Согласно инструкции:

Функция перераспределить() изменяет размер блока памяти указал , чтобы с помощью PTR в байты размера. Содержимое не будет изменено в диапазоне с начала региона до минимума старого и новых размеров. Если новый размер больше старого, добавленная память не будет инициализирована. Если ptr имеет значение NULL, то вызов равен , эквивалент malloc (размер), для всех значений размера; если размер равен до нуля, а ptr не равен NULL, тогда вызов эквивалентен бесплатно (ptr). Если ptr не равен NULL, он должен быть возвращен предыдущим вызовом для malloc(), calloc() или realloc(). Если перемещенная область была перемещена, выполняется свободное (ptr).

Итак, для использования realloc() вам следует передать указатель NULL при первом вызове. Таким образом, arr должен быть инициализирован до NULL.

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