двойная свободная или коррупционная 3d-matrix в C

Я получаю ошибку «двойной свободной или коррупционной», освобождая 3d-массив. Может кто-нибудь, пожалуйста, скажите мне, где проблема в коде? Размер массива равен 2 * N * N. Значение N здесь равно 100. Даже без литья, тот же результат. Вот код:

// Mallocing double ***h = malloc(2 * (sizeof(double**))); for(i = 0; i < N; i++) { h[i] = malloc(N * sizeof(double*)); for(j = 0; j < N; j++) { h[i][j] = malloc(N * sizeof(double)); } } // Freeing for(i = 0; i < N; i++) { for(j = 0; j < N; j++) { free(h[i][j]); } free(h[i]); } free(h); 

Программа работает нормально, но в конце я получаю сообщение об ошибке «double free or corruption (! Prev): 0x08cd24f8« Aborted (core dumped) ».

Для первого измерения вы выделяете 2 элемента:

 double ***h = (double***) malloc(2 * (sizeof(double**))); 

Но вы относитесь к нему так, как если бы у него было N элементов:

 for(i = 0; i < N; i++) { h[i] = ... 

Измените внешнее сравнение циклов на распределение и бесплатно:

 for(i = 0; i < 2; i++) { 

Также не бросайте возвращаемое значение malloc . Кроме того, в вашем коде отсутствует обработка ошибок и будет ломаться, если распределение не выполняется.

Поскольку, как я вижу, вы выделяете 2 элемента, а затем заполняете N из них.

 double ***h = (double***) malloc(2 * (sizeof(double**))); for(i = 0; i < N; i++) { h[i] = (double**) malloc(N * sizeof(double*)); .... .... } 

Вы переписываете не выделенное пространство, если N> 2 ...

Проблема здесь:

 double ***h = (double***) malloc(2 * (sizeof(double**))); for(i = 0; i < N; i++) { // ... } 

Вы только malloc 2 элементы и итерации по N Я думаю, вы хотели иметь массив размером N*N*N , но вместо этого вы получили 2*N*N

Итак, это:

 double ***h = (double***) malloc(2 * (sizeof(double**))); 

Должно быть:

 double ***h = (double***) malloc(N * (sizeof(double**))); 

Если значение N = 100 как в вашем комментарии, вам нужно выделить память для хранения N указателя на указатель, где у вас всего 2.

 double ***h = malloc(N * (sizeof(double*))); 

Не бросать malloc()

Как указывали другие, конкретная проблема, вызывающая ошибку, заключается в том, что вы обрабатываете измерение с помощью двух элементов, как если бы у него было N элементов.

Однако основной причиной этого является обфускация. Есть некоторые правила, которые я бы настоятельно рекомендовал вам:

  • Всегда выделяйте многомерные массивы как истинные массивы, выделенные в соседней памяти . Ссылка .
  • Никогда не выделяйте многомерные массивы как таблицы поиска на основе указателей на указатели, которые fragmentированы по всей куче. Мало того, что они медленнее и делают код более трудным для чтения, они не являются массивами. Вы не можете использовать их вместе с memcpy() и т. Д.

    К сожалению, существует множество плохих учителей программирования C и плохих книг, которые проповедуют fragmentированные поисковые таблицы с указателями на указатели. Так много программистов должны отучить это, это пугает …

  • Никогда не используйте более двух уровней косвенности в вашей программе. Никогда не должно быть причин для этого, все, что он делает, – превратить вашу программу в менее читаемую (Reference MISRA-C: 2012 правило 18.5). Это на самом деле известно как «трехзвездочное программирование», и это не лестный термин.

  • Никогда не бросайте результат malloc, потому что это бессмысленно .

Что вы должны делать:

 double (*array)[Y][Z] = malloc( sizeof(double[X][Y][Z]) ); ... free(array); 

Пример:

 #include  #include  #define X 2 #define Y 3 #define Z 4 int main (void) { double (*array)[Y][Z] = malloc( sizeof(double[X][Y][Z]) ); double count = 0.0; for(int x=0; x 

Чтобы скомпилировать это, вам нужен компилятор, который не старше 16 лет.