Мне нужно создать 2d-матрицу, и в каждую ячейку я должен поместить массив, длина которого вычисляется в функции, когда я пытаюсь выполнить следующий код, он вылетает с ошибкой Segmentation fault (core dumped)
. На мой взгляд, матрица имеет N_Sweep строк, N столбцов, и последнее измерение вычисляется в функции.
double ***gamma;
gamma = malloc(N_Sweep*sizeof(double**));
for(i=0;i<N_Sweep;i++){
gamma[i] = malloc(N_Sweep*N*sizeof(double*));
}
// ...
for(t=0;t<N;t++){
for(i = 0; i<N_Sweep; i++){
for(t_M = 1; t_M<(N_Sweep - i); t_M++){
gamma[i][t] = malloc(sizeof(double) * (N_Sweep-i));
gamma[i][t][t_M] = 3.0;
}
}
}
прототип функции:
void gamma_computation(double ***gamma);
Я не понимаю sizeof gamma
часть вашего комментария.
Сначала вы должны выделить только N * sizeof(double *)
байт в первом цикле, потому что вам нужны N столбцов, а не N * N_Sweep
, также внутри третьего вложенного цикла вы выделяете третье измерение матрицы несколько раз (утечка памяти), когда вы должны сделать это просто один раз перед входом в цикл.
Итак, код должен быть:
double ***gamma;
gamma = malloc(N_Sweep*sizeof(double**));
for(i=0;i<N_Sweep;i++){
gamma[i] = malloc(N*sizeof(double*));
}
// ...
for(t=0;t<N;t++){
for(i = 0; i<N_Sweep; i++){
gamma[i][t] = malloc(sizeof(double) * (N_Sweep-i));
for(t_M = 1; t_M<(N_Sweep - i); t_M++){
gamma[i][t][t_M] = 3.0;
}
}
}
В сторону:
malloc
можно упростить, скажемmalloc(N_Sweep * sizeof gamma)
для первого и так далее..Это тоже рекомендуемый метод..Вторые три звезды опасны, за исключением случаев, когда они в вооруженных силах !!