читать неопределенное количество целых чисел, пока одно из них не станет отрицательным, а затем распечатать их - PullRequest
1 голос
/ 16 февраля 2020

Я новичок в указателях, поэтому я попытался изобрести эту простую проблему. почему не работает? кроме как сказать, какую ошибку я совершил, я был бы очень признателен, если бы вы, ребята, могли бы сказать мне альтернативу этому методу

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

int main(int argc, char *argv[]) {
    int *p;
    int i, j;
    i = 0;
    p = (int *)malloc(sizeof(int) * (i + 1));
    scanf("%d", p);
    do {
        i++;
        p = realloc(p, sizeof(int) * i);
        scanf("%d", (p + i));
    } while (*(p + i) > 0);

    for (j = 0; j < i; j++) {
        printf("%d\n", *(p + j));
    }
    free(p);
    return 0;
}

1 Ответ

2 голосов
/ 16 февраля 2020

Это утверждение

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
...