2016-01-05 2 views
0

У меня есть следующий код C:Создание в C динамического 3D массива

char buffer[255]; 
    char ***data = NULL; 
    int i = 0; 
    int size = 10; 

    **data = (char*) calloc(size, sizeof(char**)); 

    while(fgets(buffer, 255, database)) { 
    if(i + 1 >= size) { 
     size += 10; 
     **data = (char*) realloc(**data, size*sizeof(char**)); 
    } 

    char **line = str_split(buffer, ',', 6); 
    **data[i++] = **line; 
    } 

Я нуб в C. И я не понимаю rearly моего кода. Но мне нужен массив 3D-символов (в Java я скажу массив 2D String). Первые [] - это строки из моего текстового файла с «fgets» из «базы данных» (и я не знаю, сколько строк, вот почему я хочу, чтобы он был динамическим). Второй [] и thirt [] заполнены значениями из str_split.

str_split работает отлично, вот код:

char** str_split(char* str, const char a_delim, int count) { 
    char **result; 
    char *token; 
    char *rest = str; 
    char delim[] = { a_delim, '\0' }; 

    result = (char**) malloc(sizeof(char*) * count); 

    int i = 0; 
    while((token = strtok_s(rest, delim, &rest))) { 
    *(result + i++) = token; 
    } 

    return result; 
} 

Так что проблема во время выполнения я получаю следующее сообщение об ошибке:

Access violation writing location 0x00000000.

Что не так?

+1

1) '** data = (char *) calloc (size, sizeof (char **));' -> 'data = (char ***) calloc (size, sizeof (char **)) ; ' – BLUEPIXY

+0

« Я не совсем понимаю мой код »: Тогда как вы его написали? И где эта ошибка? –

+0

* «Я почти не понимаю мой код» * Ну, это расстраивает. Как вы можете ожидать, что другие поймут это? –

ответ

2

Первый Alloc должен выглядеть следующим образом:

data = (char***) calloc(size, sizeof(char**)); 

Похожие на перераспределить, и, наконец,

data[i++] = line; 

Проблема заключается в том, что вы пытаетесь данных разыменования (**data) присвоить ему значение из calloc, но данные начинаются с нуля, поэтому вы получаете нарушение доступа. В общем, вы должны убедиться, что указатель не является нулевым, прежде чем вы его осмеливаетесь.