2014-10-23 1 views
-1

Я написал программу c, которая считывает числа квадратных матриц и сохраняет их в 2d динамическом массиве, чтобы впоследствии найти некоторые определенные точки. Теперь все прошло нормально, пока я не получил задачу переместить все сохраненные числа в новый 1d динамический массив. В этот момент программа вылетает при попытке доступа к функции, которая выделяет память нового массива и перемещает числа к ней. Поскольку я новичок не только для c, но и для программирования в целом, любая обратная связь будет оценена по достоинству.c сбой программы при доступе к функции, которая выделяет память

теперь это функция, которая должна выделить память нового массива

void perkelimas(int ***matrica, int *n, int **matrica2) 
{ 
    int naujas_dydis = (*n)*(*n); 
    printf("%i dydis \n", naujas_dydis); 
    *matrica2 = malloc(naujas_dydis*sizeof(int)); 
    int w; 
    int b = 0; 
    int c = 0; 
    for(w = 0; w < naujas_dydis; w++) 
    { 

    printf("%i \n", w); 
    printf("b = %i, c = %i \n", b, c); 


    if(c < *n) 
    { 
     *matrica2[w] = *matrica[b][c]; 
     printf("%i \n", *matrica2[w]); 
     c++; 
    } 

    if (c == *n) 
    { 
     c = 0; 
     b++; 
    } 
} 

}

и здесь является основной функцией

int main() 
{ 
    int *n; 
    int i,j; 
    int **matrica; 
    int *matrica2 = NULL; 
    atmintis(&matrica, n); 
    i = 0; 
    j = 0; 
    int k = 0; 
    while(i < *n) 
    { 
     while(j < *n) 
     { 
      printf("iveskite tasko dydi: \n"); // this is where user inputs matrix numbers 
      scanf("%i", &matrica[i][j]); 
      j++; 
     } 
     i++; 
     j = 0; 
    } 
    i = 0; 
    j = 0; 
    int m = 0; 
    int l = 0; 
    printf("matrica: \n"); 
    while (l < *n) 
    { 
     while (m < *n) 
     { 
      printf("%i", matrica[l][m]); 
      printf(" "); 
      m++; 
     } 
     printf("\n"); 
     m = 0; 
     l++; 
    } 
    printf("\n"); 
    printf("balno tasku koordinates: \n"); 
    while (i < *n) 
    { 
     while (j < *n) 
     { 
      int x,y; 
      x = j+1; 
      y = i+1; 
      if(tikrinimas(i, j, *n, matrica) == 1) 
      { 
       printf("%i", x); 
       printf(" "); 
       printf("%i", y); 
       printf("\n"); 
      } 
      j++; 
     } 
     j = 0; 
     i++; 
    } 

    perkelimas(matrica, n, matrica2); 

    for(i = 0; i < *n; i++) 
    { 
     free(matrica[i]); 
    } 

    return 0; 
} 

и здесь функция, которая выделяет память 2d-массива

void atmintis(int ***matrica, int *n) 
{ 
    printf("Iveskite matricos ilgi ir ploti: "); 
    scanf("%i", &(*n)); // length and width of matrix 
    int q; 
    (*matrica) = (int**)malloc((*n)*sizeof(int)); 
    for (q = 0 ; q < *n ; q++) 
    { 
     (*matrica)[q] = (int*)malloc((*n)*sizeof(int)); 
    } 
} 

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

+1

'(int **) malloc ((* n) * sizeof (int));' должно быть '(int **) malloc ((* n) * sizeof (int *));'. Это было бы очень важно в 64-битных машинах, где оба размера различны. Не так в 32-битных системах. – rodrigo

+1

Что с чрезмерным использованием указателей? Вы просто настраиваете себя на неприятности. Почему 'n' в' main() 'даже указатель? Это даже не инициализировано. –

+0

Вы пробовали использовать отладчик? Что такое трассировка стека при сбое программы? – b4hand

ответ

0

Есть несколько вещей, чтобы модифицирующие:

  • Как отметил @rodrigo sizeof(int*) может отличаться от sizeof(int), на 64-битные plateforms, например.

  • n является int*, указателем на int, который указывает на что-то. Это место никогда не выделяется. Это приводит к неопределенному поведению. Это может вызвать ошибку сегментации. Чтобы предотвратить это, n может быть int, а функции используют &n, указатель на n.

  • Функция perkelimas() ожидает указатель на двумерную матрицу и указатель на массив. perkelimas(matrica, &n, matrica2); должен быть perkelimas(&matrica, &n, &matrica2);

  • В функции perkelimas() могут быть добавлены brakets: (*matrica2)[w] = (*matrica)[b][c];

  • free(matrica) и free(matrica2)

Вот код:

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

void atmintis(int ***matrica, int *n) 
{ 
    printf("Iveskite matricos ilgi ir ploti: "); 
    scanf("%i", &(*n)); // length and width of matrix 
    int q; 
    (*matrica) = (int**)malloc((*n)*sizeof(int*)); 
    for (q = 0 ; q < *n ; q++) 
    { 
     (*matrica)[q] = (int*)malloc((*n)*sizeof(int)); 
    } 
} 

void perkelimas(int ***matrica, int *n, int **matrica2) 
{ 
    int naujas_dydis = (*n)*(*n); 
    printf("%i dydis \n", naujas_dydis); 
    *matrica2 = malloc(naujas_dydis*sizeof(int)); 
    int w; 
    int b = 0; 
    int c = 0; 
    for(w = 0; w < naujas_dydis; w++) 
    { 

     printf("%i \n", w); 
     printf("b = %i, c = %i \n", b, c); 


     if(c < *n) 
     { 
      (*matrica2)[w] = (*matrica)[b][c]; 
      printf("%i \n", (*matrica2)[w]); 
      c++; 
     } 

     if (c == *n) 
     { 
      c = 0; 
      b++; 
     } 
    } 
} 

int main() 
{ 
    int n; 
    int i,j; 
    int **matrica; 
    int *matrica2 = NULL; 
    atmintis(&matrica, &n); 
    i = 0; 
    j = 0; 
    int k = 0; 
    while(i < n) 
    { 
     while(j < n) 
     { 
      printf("iveskite tasko dydi: \n"); // this is where user inputs matrix numbers 
      scanf("%i", &matrica[i][j]); 
      j++; 
     } 
     i++; 
     j = 0; 
    } 
    i = 0; 
    j = 0; 
    int m = 0; 
    int l = 0; 
    printf("matrica: \n"); 
    while (l < n) 
    { 
     while (m < n) 
     { 
      printf("%i", matrica[l][m]); 
      printf(" "); 
      m++; 
     } 
     printf("\n"); 
     m = 0; 
     l++; 
    } 
    printf("\n"); 
    printf("balno tasku koordinates: \n"); 
    while (i < n) 
    { 
     while (j < n) 
     { 
      int x,y; 
      x = j+1; 
      y = i+1; 
      /*  if(tikrinimas(i, j, *n, matrica) == 1) 
      { 
       printf("%i", x); 
       printf(" "); 
       printf("%i", y); 
       printf("\n"); 
      }*/ 
      j++; 
     } 
     j = 0; 
     i++; 
    } 

    perkelimas(&matrica, &n, &matrica2); 

    for(i = 0; i < n; i++) 
    { 
     free(matrica[i]); 
    } 
    free(matrica); 
    free(matrica2); 
    return 0; 
} 

Вы сделали хорошо передающий указатель на int n и указатель на 2D-матрицу matrica для выполнения распределения: эта функция будет изменять значения n и matrica. Это не относится к функции void perkelimas(int ***matrica, int *n, int **matrica2): эта функция не изменяет matrica или n. Достаточно void perkelimas(int **matrica, int n, int **matrica2). Поскольку matrica2 изменен (выделен здесь), требуется передать указатель на массив matrica2.