Почему в массиве кучи в C есть только один странный элемент в массиве, а другие в порядке? - PullRequest
0 голосов
/ 28 марта 2020

Я создал программу для разделения одного основного массива с целыми числами на два динамически распределенных массива с нечетными и четными целыми числами.

Все хорошо, кроме одного элемента в обоих нечетных и четных массивах, которые вы можете увидеть в выходной картинке. Я надеюсь, вы понимаете, о чем я. Также приветствуются любые советы по улучшению кода. Заранее спасибо:)

Код:

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

void printArr(int * arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n\n");
}

int main() {
    int arr[] = { 7689, 6534, 456, 67, 7652, 879, 544, 12, 4345, 867, 44, 23545, 8, 6787, 34, 26, 56, 3, 41, 6 };
    int size = sizeof(arr) / sizeof(arr[0]);
    int *arrPtr = arr;

    int *oddArr = malloc(sizeof(int));
    if (oddArr == NULL) {
        return 1;
    }
    int oddArrSize = 0;
    int *evenArr = malloc(sizeof(int));
    if (evenArr == NULL) {
        return 1;
    }
    int evenArrSize = 0;

    for (int i = 0; i < size; i++) {
        if (arr[i] % 2 == 0) {
            oddArr = realloc(oddArr, sizeof(oddArr) + sizeof(int));
            if (oddArr == NULL) {
                return 1;
            }
            oddArr[oddArrSize] = arr[i];
            oddArrSize++;
        }
        else {
            evenArr = realloc(evenArr, sizeof(evenArr) + sizeof(int));
            if (evenArr == NULL) {
                return 1;
            }
            evenArr[evenArrSize] = arr[i];
            evenArrSize++;
        }
    }

    printf("Main arr: \n");
    printArr(arrPtr, size);

    printf("Odd arr: \n");
    printArr(oddArr, oddArrSize);

    printf("Even arr: \n");
    printArr(evenArr, evenArrSize);

    free(oddArr);
    free(evenArr);
}

Выход: Выход

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Вы неправильно увеличиваете массивы с помощью realloc().

oddArr = realloc(oddArr, sizeof(oddArr) + sizeof(int));

sizeof(oddArr) - это размер указателя, а не размер массива, на который он указывает. Поэтому каждый раз, когда вы вызываете realloc(), вы выделяете массив одинакового размера, а не увеличиваете размер.

Это должно быть:

oddArr = realloc(oddArr, (oddArraySize + 1) * sizeof(int));

И вы должны делать то же самое для четного массива.

0 голосов
/ 28 марта 2020

evenArr = realloc(evenArr, sizeof(evenArr) + sizeof(int)); неверно, так как всегда выделяется один и тот же размер, поскольку sizeof(evenArr) является константой. Вы хотите:

evenArr = realloc(evenArr, evenArrSize * sizeof *evenArr);

, и вам также нужно будет корректно увеличивать evenArrSize. Например, вам нужно увеличить его до вызова reallo c, а не после. Хотя это немного нетипично увеличивать на единицу и реально c для каждого элемента данных. Обычный шаблон - удваивать размер только при необходимости или увеличивать его на размер куска больше 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...