2014-10-25 3 views
0

Пустоты следует читать два мерных массива, но когда он начинает второй я цикл он выходит из строя какие-либо идеиC ошибка при чтении двух мерного массива

void skaitymas(int ***matrica, int *n) 
{ int i,j,o,g,k; 

    printf("Iveskite eiluciu ir stulpelius skaiciu \n"); 
    scanf("%d",n); 

    (*matrica)= malloc(sizeof(int)*(*n)); 

    for(i=0; i<*n; i++) 
     (*matrica)[i] = malloc(sizeof(int)*(*n)); 

    for (i=0;i<*n;i++) 
    { 
     for (j=0;j<*n;j++){ 
     scanf("%d", &matrica[i][j]); 

    } 
+1

Исправить утверждение scanf ("% d", &n); вы пропустили &. Больше над * n в аргументе функции и "n", которое используется для принятия значения, противоречиво. –

+0

Это ответ @Madan, а не комментарий. Вы должны сказать это как ответ. – dave

+1

@Madan см. 'Int * n' – BLUEPIXY

ответ

1

У вас есть две существенные проблемы в этом коде (отсутствие проверки ошибок не выдерживая)

  • Ваше использование разыменования и адреса ofoperators ([] и &) ISN» т составляет operator precedence. Вам также не хватает базового разыменования самого указателя, который вы только что установили во внешнем распределении.
  • Вы назначаете размер на основе указанного типа (int), вместо использования sizeof в сочетании с указанной переменной указателем указателя. В этом случае ваш указанный тип (int) и то, что вы пытаетесь загрузить его (int*), - , а не.

Что касается первого, то эта линия:

scanf("%d", &matrica[i][j]); 

должен генерировать это предупреждение, говоря вам что-то не так:

main.c:20:25: Format specifies type 'int *' but the argument has type 'int **' 

или что-то подобное. Если вы этого не видите, включите уровни предупреждений. Независимо от того, просмотрите таблицу operator precedence.

Что касается второго вопроса, то эта линия:

(*matrica)= malloc(sizeof(int)*(*n)); 

счастливо выделить объем памяти, вы просили, и если вы (не) повезло, размер элементов выделяется (int) совпадает с размер базового типа указателя (int*). Лучший способ сделать это, чтобы использовать переменную указателя в заявлении выделения в сочетании с sizeof

(*matrica)= malloc(sizeof(**matrica)*(*n)); 

Принимая оба вышеуказанных пунктов во внимание, используя указатель арифметика для загрузки значений строк и интеграции row- распределение с чтением строк, одна реализация может выглядеть так:

void skaitymas(int ***matrica, int *n) 
{ 
    int i,j; 

    *matrica = NULL; 

    printf("Iveskite eiluciu ir stulpelius skaiciu \n"); 
    if (scanf("%d",n) == 1 && n > 0) 
    { 
     *matrica = malloc(*n * sizeof(**matrica)); 
     for (i=0; i<*n; ++i) 
     { 
      (*matrica)[i] = malloc(*n * sizeof(***matrica)); 
      for (j=0; j<*n; ++j) 
       scanf("%d", (*matrica)[i]+j); 
     } 
    } 
} 

Оставляя лодку проверки ошибок как упражнения для вас. Удачи.

+0

Зачем использовать этот «сложный»: '(* matrica) [i] + j)' ? Как упражнение для читателя? ;-) Почему бы не сделать прямо: '& (* matrica) [i] [j])'? Однако 1+ для всех других исправлений и приятных модов. – alk

+0

@alk взгляните на оба эти выражения и ** честно ** решите, что более «сложно». Рано или поздно OP лучше изучил математику указателя. Может начаться и сейчас. (и на самом деле это упражнение, скорее всего, сделает это неизбежным). – WhozCraig

+0

Достаточно справедливо ... так что назовем это «упражнениями пальцев», нужно практиковать на регулярной основе. ;-) – alk

1

Изменить это утверждение

(*matrica)= malloc(sizeof(int)*(*n)); 

в

*matrica = malloc(sizeof(int *) * (*n)); 

Также изменить эту петлю

for (i=0;i<*n;i++) 
{ 
    for (j=0;j<*n;j++){ 
    scanf("%d", &matrica[i][j]); 

} 

в

for (i=0;i<*n;i++) 
{ 
    for (j=0;j<*n;j++){ 
    scanf("%d", &(*matrica)[i][j]); 

} 
+0

Или еще лучше для 1-го статута: '* matrica = malloc (sizeof (** matrica) * (* n));' – alk

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