Ваша часть scanf
реализована неправильно. Это уничтожает ваши данные. По иронии судьбы, проблема не проявляется во время фазы scanf
, но вместо этого вызывает сбой на стадии printf
.
Правильный код scanf
может выглядеть следующим образом
for(int i=0;i<2;i++)
{
p1[i]=(int *) malloc(3*sizeof(int));
for(int j=0;j<3;j++)
{
scanf("%d",*(p1+i)+j);
}
}
Обратите внимание на дополнительные *
. Что вам действительно нужно здесь, это
scanf("%d", &(*(*(p1 + i)) + j));
Вы можете написать это так, если хотите. Но вы можете заметить, что внешний &
«аннигилирует» со следующим вложенным *
, поэтому вышеприведенное эквивалентно
scanf("%d", *(p1 + i) + j);
Однако я советую вам прекратить использовать едва читаемую комбинацию *-and-+
для доступа к элементу массива и вместо этого начать использовать []
. Так должен выглядеть ваш код с самого начала
...
scanf("%d", &p1[i][j]);
...
printf("%d\n", p1[i][j]);
Кроме того, поскольку это помечено буквой C, избегайте использования sizeof
с максимально возможным количеством типов и прекратите приведение результата malloc
. Лучшим вариантом будет
int **p1;
p1 = malloc(2 * sizeof *p1);
for(int i = 0; i<2; i++)
{
p1[i] = malloc(3 * sizeof *p1[i]);
...