Это утверждение
p=(int *)malloc(sizeof(int) * (i+1));
является избыточным. Лучше написать
p = NULL;
И при вызове scanf использовать объект типа int, а не указатель.
Может быть избыточное выделение памяти, если, например, первое введенное значение будет отрицательным
В этом вызове
scanf("%d", (p+i));
имеется доступ за пределы выделенной памяти. Вы должны хотя бы написать
scanf("%d", (p + i -1));
В этом выражении лучше указать промежуточный указатель
p=realloc(p,sizeof(int)*i);
, поскольку функция может возвращать NULL. В этом случае адрес ранее выделенной памяти будет потерян.
И условие в l oop
}while(*(p+i)>0);
не проверяет, что значение не является отрицательным.
Программа может выглядеть следующим образом
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int *p = NULL;
size_t n = 0;
int value;
for ( int *tmp;
scanf( "%d", &value ) == 1 &&
!( value < 0 ) &&
( tmp = realloc( p, ( n + 1 ) * sizeof( int ) ) ) != NULL;
++n )
{
p = tmp;
*( p + n ) = value;
}
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", *( p + i ) );
}
putchar( '\n' );
free( p );
return 0;
}
Если ввести
0 1 2 3 4 5 6 7 8 9 -1
, вывод программы будет
0 1 2 3 4 5 6 7 8 9