2015-06-18 3 views
3

Я кодировал свой университет, где мы работаем с матрицами, и я не могу найти ошибку в коде, который меняет значение переменной, где я сохраняю столбцов матрицы. Я пробовал отлаживать его и не могу найти его, он просто заканчивает функцию, в которой я выделяю память из матрицы, и вводит следующую функцию (которая получает значения от клавиатуры для заполнения матрицы) неправильным значением столбца. Код следующий:Изменение значения переменной после возврата из функции в C

#include <stdio.h> 
#include <stdlib.h> 
#define DEBUG 1 

void allocate (int ***mat,int n,int m){ 
    int i; 
    *mat = (int **) malloc (n*sizeof(int*)); 
    for (i=0; i<n; i++){ 
     mat[i] = (int *) malloc (m*sizeof(int)); 
    } 
    #if DEBUG 
     printf ("allocate n: %d m: %d\n",n,m); 
    #endif // DEBUG 
} 

void initialize (int **mat, int n, int m){ 
    int i,j; 
    #if DEBUG 
     printf ("initialize n: %d m: %d\n",n,m); 
    #endif // DEBUG 
    for (i=0; i<n; i++){ 
     for (j=0; j<m; j++){ 
      printf ("Enter value for position [%d][%d]: ",i,j); 
      scanf ("%d",&(mat[i][j])); 
     } 
    } 
} 

int main() 
{ 
     int n=2; 
     int m=3; 
     int **mat=NULL; 
     #if DEBUG 
      printf ("before allocate n: %d m: %d\n",n,m); 
     #endif // DEBUG 
     allocate (&mat,n,m); 
     #if DEBUG 
      printf ("after allocate n: %d m: %d\n",n,m); 
     #endif // DEBUG 
     initialize (mat,n,m); 
     return 0; 
} 

Так что, если вы запустите это с DEBUG набор 1, вы получите значения п и т (которые мои строки и столбцы). Я использую кодовые блоки. Спасибо за ваше время!

+1

Можете ли вы предоставить образец вывода? – mastov

+2

Почтовый код, который фактически компилируется. Исправьте предупреждения. – ooga

+2

Вам нужно изменить выделение на '(* mat) [i] = (int *) malloc (m * sizeof (int));' – ooga

ответ

1

Update функция

void allocate(int ***mat, int n, int m) 
{ 
    int i; 

    *mat = (int **) malloc(n * sizeof(int*)); 
    for (i = 0; i < n; i++) 
    { 
     (*mat)[i] = (int *) malloc (m * sizeof(int)); 
    } 
    #if DEBUG 
     printf ("allocate n: %d m: %d\n",n,m); 
    #endif // DEBUG 
} 
1

http://coliru.stacked-crooked.com/a/4d3cb5ed16ae73a5

void allocate (int ***mat,int n,int m){ 
    int i; 
    *mat = (int **) malloc (n*sizeof(int*)); 
    for (i=0; i<n; i++){ 
     //This is where the error is. 
     (*mat)[i] = (int *) malloc (m*sizeof(int)); 
    } 
    #if DEBUG 
     printf ("allocate n: %d m: %d\n",n,m); 
    #endif // DEBUG 
} 

Вы видите, вы фактически не ссылаться на конкретную ячейку в массиве с mat[i]. Нет, вы на самом деле ссылались на указатель на матрицу и затем индексировались в столбец или строку, что означает, что вы выделили память для int*, а не int.

Таким образом, вам нужно почитать исходный указатель на матрицу, а затем index ->(mat*)[i].