Назначение целых указателей с помощью scanf - PullRequest
0 голосов
/ 01 мая 2019

У меня есть вопрос, похожий на этот: Назначение массива указателей с помощью scanf

Вместо того, чтобы назначать значения символов массиву указателей, которым я хотел бы присвоить значенияint из указателей с scanf.В следующем примере я назначил бы 10 значений типа int, и именно поэтому он жестко задан.

void main(void) {
    int *pi;

    long sum;

    pi = (int *)malloc(10 * sizeof(int));

    if(pi == NULL)
        /* Error Handling */

    printf("\n\nPlease put in 10 values.\n\n");

    for(int i = 0; i < 10; i++) {
        printf("%d. Value: ", i + 1);
        scanf("%d", pi + i);
        /* It was scanf("%d", pi + 1) in previous version. */

        sum += *(pi + i);
        /* Same issue, it was sum += *(pi + 1) in the previous version. */
    }

    printf("\nSum of dynamic allocated memory: %ld", sum);

    free(pi);
}

После вставки 10 значений на выходе получается 6474931, что, я думаю, является начальным значением.Любая идея, что я делаю неправильно?

Спасибо за любую помощь, которая очень ценится.

Ответы [ 2 ]

1 голос
/ 01 мая 2019

После ввода 10 значений на выходе получается 6474931, то есть начальное значение?

Это потому, что переменная sum не инициализирована, по умолчанию он содержит некоторые ненужные данные из-за автоматического хранения.

Инициализируйте его с нуля.

long sum = 0;

Также здесь

pi = (int *)malloc(10 * sizeof(int));

приведение типов malloc() необязательно, так как malloc() тип возвращаемого значения void*тип и он безопасно конвертируется в нужный тип указателя автоматически.Например,

pi = malloc(10 * sizeof(*pi));
if(pi == NULL) {
  /* @TODO error handling */
}

Do Read Разыгрывать ли я результат malloc?

Также здесь

scanf("%d", pi + 1);
sum += *(pi + 1);

, который вы хотели использовать pi + i * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * [10] * * * * * * 10 * * * * * * * * * 10 * * * * * * * * * * * * * * * * * * * * * * *.Поэтому измените его на

scanf("%d", pi + i);
sum += *(pi + i);

Пример кода:

int main(void) {
    long sum = 0;
    int *pi = malloc(10 * sizeof(*pi));
    if(pi == NULL) {
        /* @TODO Error Handling */
    }
    printf("\n\nPlease put in 10 values.\n\n");
    for(int i = 0; i < 10; i++) {
        printf("%d. Value: ", i + 1);
        scanf("%d", pi + i);
        sum += *(pi + i);
    }
    printf("\nSum of dynamic allocated memory: %ld", sum);
    free(pi);
    return 0;
}

O / p:

Пожалуйста, введите 10 значений.

  1. Значение: 1
  2. Значение: 2
  3. Значение: 3
  4. Значение: 4
  5. Значение: 5
  6. Значение: 6
  7. Значение: 7
  8. Значение: 8
  9. Значение: 9
  10. Значение: 10

Сумма динамически выделенной памяти: 55

1 голос
/ 01 мая 2019

Вместо (pi + 1) должно быть (pi + i).

...