У вас есть две существенные проблемы в этом коде (отсутствие проверки ошибок не выдерживая)
- Ваше использование разыменования и адреса 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);
}
}
}
Оставляя лодку проверки ошибок как упражнения для вас. Удачи.
Исправить утверждение scanf ("% d", &n); вы пропустили &. Больше над * n в аргументе функции и "n", которое используется для принятия значения, противоречиво. –
Это ответ @Madan, а не комментарий. Вы должны сказать это как ответ. – dave
@Madan см. 'Int * n' – BLUEPIXY