2015-12-19 4 views
-2

У меня возникли проблемы с реализацией динамической матрицы. Теоретически кажется ясным, что я должен делать, и я уже прочитал некоторые подобные вопросы на этом сайте (а также на других ресурсах). Хотя, следующий очень простой код не работает. Вы не против предлагать, как найти ошибки?Пытается реализовать матрицу динамического размера в C. Где ошибка?

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

int main() { 
    int dim1 = 10; // #Rows 
    int dim2 = 4; // #Columns 
    int i; 
    int j; 

    double **mtrx = (double **)malloc(sizeof(double **) * dim1); 
    // mtrx is my dynamic matrix, of size dim1*dim2 // 

    for (i = 0; i < dim1; ++i) 
     mtrx[i]= (double *)malloc(sizeof(double *) * dim2); 

    // (1) Inizialize// 
    for (i = 0; i < dim1; ++i) { 
     printf("(%d):\t", i); 
     for (j = 0; j < dim2; ++j) { 
      mtrx[i][j] = i; 
      printf("mtrx[%d][%d] = %.f ", i, j, mtrx[i][j]); 
     } 
     printf("\n"); 
    } 

    // (2) Show the results// 
    printf("\nShow the results:\n"); 

    for (i = 0; i < dim1; ++i) { 
     printf("(%d):\t", i); 
     for (j = 0; j < dim2; ++j) 
      printf("mtrx[%d][%d] = %.f ", i, j, mtrx[i][j]); 
     printf("\n"); 
    } 

    // (3) Free the memory 
    printf("\n***free the memory***\n"); 

    for (i = 0; i < dim1; ++i) 
     free(mtrx[i]); 

    free(mtrx); 

    return 0; 
} 

Целью моего кода является следующее. Сначала объявите динамическую матрицу размера dim1 * dim2 (т. Е. Строки «dim1» и столбцы «dim2»). Than, phase (1), инициализировать каждый элемент, следующий за простым шаблоном (mtrx [i] [j] = i). Обратите внимание, что здесь есть «превышение» команд printf: я добавил его для целей «отладки», чтобы убедиться в правильности процедуры инициализации (что работает правильно). Затем, фаза 2, я показываю результаты, и, наконец, я освобождаю используемую память.

Проблемы:

  • фаза 2 не показывает результаты "правильно";
  • в свободной фазе, я получаю ошибку, как

*** свободный(): недействительный следующий размер (быстро) ...

Мой подозреваемый: у меня может быть неправильно объявила память для моей матрицы, вызывая некоторое переполнение данных и несовместимость с «свободной» инструкцией, но, к сожалению, мне не удается найти ошибку.

Я благодарю вас за любую помощь !!!

+4

В первом 'malloc' вам нужно использовать' sizeof (double *) 'и во втором' sizeof (double) '. Удачи. –

+0

Гоша, вы правы! Огромное спасибо! ;) – user233650

+0

Добро пожаловать. –

ответ

2

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

(sizeof(type of the table) * the_number_of_cells_you_want); 

Вы должны выделить sizeof(double*) * dim1 на первый. Затем в петле:

for (i = 0; i < dim1; ++i) 
    mtrx[i]= malloc (sizeof (double) * dim2); 
1

Необходимо изменить распределение памяти в другом месте, как показано на рисунке, и don't cast the result of malloc.

double ** mtrx = malloc (sizeof (double *) * dim1); 

     mtrx[i]= malloc (sizeof (double) * dim2); 
3

Вы назначаете массив указателей на массивы. C99 позволяет выделить 2D массив с размерами во время выполнения в один шаг так:

double (*mtrx)[dim2] = malloc(sizeof(double) * dim1 * dim2); 

Если dim1 и dim2 не слишком велики, вы можете даже определить mtrx как локальный 2D массив с автоматическим хранением:

double mtrx[dim1][dim2]; 

Для этого вам нужен современный компилятор C, gcc или clang, собственный C-компилятор Microsoft довольно устарел и не поддерживает функции C99, стандартизированные более 15 лет назад. К счастью, gcc и clang доступны в разных портах для ОС Windows.

+0

Благодарим вас за дополнительную информацию! – user233650

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