2013-08-27 4 views
-1
#include <stdio.h>  
#include <stdlib.h> 

#define MAX_ROWS 5 
#define MAX_COLS 5  

int globalvariable = 100; 

void CreateMatrix(int ***Matrix) 
     { 
     int **ptr; 
     char *cp; 
     int i = 0; 

     *Matrix = (int**)malloc((sizeof(int*) * MAX_ROWS) + ((MAX_ROWS * MAX_COLS)*sizeof(int))); 
     ptr = *Matrix; 
     cp = (char*)((char*)*Matrix + (sizeof(int*) * MAX_ROWS)); 

     for(i =0; i < MAX_ROWS; i++) 
     { 
      cp = (char*)(cp + ((sizeof(int) * MAX_COLS) * i)); 
      *ptr = (int*)cp; 
      ptr++;  
     } 

    } 

    void FillMatrix(int **Matrix) 
    { 
     int i = 0, j = 0; 

     for(i = 0; i < MAX_ROWS; i++) 
     { 
      for(j = 0; j < MAX_COLS; j++) 
      { 
       globalvariable++;   
       Matrix[i][j] = globalvariable; 
      } 
     } 

    } 

    void DisplayMatrix(int **Matrix) 
    { 
     int i = 0, j = 0; 

     for(i = 0; i < MAX_ROWS; i++) 
     { 
      printf("\n"); 
      for(j = 0; j < MAX_COLS; j++) 
      { 
       printf("%d\t", Matrix[i][j]);       
      } 
     } 
    } 

    void FreeMatrix(int **Matrix) 
    { 
     free(Matrix); 
    } 


    int main() 
    { 
     int **Matrix1, **Matrix2; 

     CreateMatrix(&Matrix1); 

     FillMatrix(Matrix1); 

     DisplayMatrix(Matrix1); 

     FreeMatrix(Matrix1); 

     getchar(); 

     return 0; 
    } 

Если код выполнен, в диалоговом окне появляются следующие сообщения об ошибках.Создание 2D-массива в одном вызове malloc()

Windows has triggered a breakpoint in sam.exe. 

This may be due to a corruption of the heap, which indicates a bug in sam.exe or any of the DLLs it has loaded. 

This may also be due to the user pressing F12 while sam.exe has focus. 

The output window may have more diagnostic information. 

Я пытался отладки в Visual Studio, когда printf("\n"); заявление DisplayMatrix() выполняется, то же самое сообщение об ошибке воспроизводится.

Если я нажму продолжать, он будет печатать от 101 до 125, как ожидалось. В режиме выпуска нет проблем!.

Пожалуйста, поделитесь своими идеями.

+4

Я уверен, что уже говорил об этом раньше, но [пожалуйста, не набрасывайте возвращаемое значение 'malloc()' в C] (http://stackoverflow.com/questions/605845/do-i Литой-заместитель на результат из-таНоса). Благодарю. – unwind

+0

@unwind В VS есть ошибка 'can not convert from 'void *' to 'int **'' – Jeyaram

+1

@Jeyaram Вы должны скомпилировать C-код как C, а не как C++ (как вы сейчас пытаетесь сделать) , –

ответ

1

В С часто бывает проще и эффективнее выделить числовую матрицу с calloc и использовать вычисление явного индекса ... так

int width = somewidth /* put some useful width computation */; 
int height = someheight /* put some useful height computation */ 
int *mat = calloc(width*height, sizeof(int)); 
if (!mat) { perror ("calloc"); exit (EXIT_FAILURE); }; 

Затем инициализировать и заполнить матрицу путем вычисления смещения соответственно, например что-то вроде

for (int i=0; i<width; i++) 
    for (int j=0; j<height; j++) 
    mat[i*height+j] = i+j; 

, если матрица имеет (как вы показываете) размеры известны во время компиляции, вы можете либо сложить выделить его с

{ int matrix [NUM_COLS][NUM_ROWS]; 
    /* do something with matrix */ 
    } 

или куче выделить его. Я нахожу более удобным для чтения, чтобы сделать ее struct как

struct matrix_st { int matfield [NUM_COLS][NUM_ROWS]; }; 
    struct matrix_st *p = malloc(sizeof(struct matrix_st)); 
    if (!p) { perror("malloc"); exit(EXIT_FAILURE); }; 

затем заполнить его соответствующим образом:

for (int i=0; i<NUM_COLS; i++) 
    for (int j=0; j<NUM_ROWS, j++) 
     p->matfield[i][j] = i+j; 

Помните, что malloc возвращается в зону неинициализированным памяти так что вы должны инициализировать все.

+0

Но зачем это делать вручную, если компилятор делает это для вас автоматически? –

+1

'#define MAX_ROWS 5', кажется, расширяется до постоянной времени компиляции ... –

0

Двумерный массив не совпадает с указателем на указатель. Возможно, вы имели в виду

int (*mat)[MAX_COLS] = malloc(MAX_ROWS * sizeof(*mat)); 

вместо этого?

+0

см. FillMatrix(), я обратился к нему как к простому массиву. – Jeyaram

+0

@Jeyaram Нет, вы обратились к нему как к указателю на указатель. –

0

Прочитано this tutorial.

Очень хорошее & полное руководство для указателей, вы можете перейти непосредственно к главе 9, если у вас есть глубокие базовые знания.

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