Вызов _strdup
, скорее всего, сбой, потому что память для (*matrix)[i][j]
не была выделена должным образом.
Использовать столько указателей, сколько нужно для чтения слов из файла, не обязательно, ночто вы используете их, для каждого из них необходимо создать память в правильном порядке.
То есть
matrix = malloc(sizeof(char *));
- это первое из мест, необходимых перед созданиемлюбые другие
Например, метод создания правильно распределенной коллекции указателей для 4-мерного массива может выглядеть следующим образом:
char **** Create4D(int hR, int p, int c, int r)
{
char ****arr;
int w,x,y;
arr = calloc(hR, sizeof(char *));
for(w=0;w<hR;w++)
{
arr[w] = calloc(p, sizeof(char *));
for(x=0;x<p;x++)
{
arr[w][x] = calloc(c, sizeof(char *));
for(y=0;y<c;y++)
{
arr[w][x][y] = calloc(r, 1);
// ^ sizeof(char) == 1
}
}
}
return arr;
}
Обратите внимание накурсивом напомним, что на самом деле это не матрица , а просто набор адресов памяти, некоторые с пространством для указателей, другие с пространством для строк char
.
.вызовите эту функцию:
char ****matrix = Create4D(2, 4, 6, 8);
if(matrix)//always test for success. If failed, matrix is set to NULL.
{
//use matrix
//With these arguments, 48 (2*4*6) pointers are created,
//each with space allocated to contain strings of 8 char each
....
Также обратите внимание, что во всех этих вызовах приведение возврата [m] [c] alloc здесь не используется, , потому что это не рекомендуется вC .Кроме того, если вы планируете создать всю эту память, соответствующие вызовы free()
должны быть сделаны для каждого вызова calloc()
.
Память от вызова метода, описанного выше в моей системе, показана здесь: