为什么C中堆内存中数组中只有一个奇怪的元素,而其他的都可以?

Why is there only one strange element in array in heap memory in C but other are ok?

我编写了一个程序,将一个带整数的主数组分成两个动态分配的奇数和偶数数组。

除了奇数数组和偶数数组中的一个元素外,一切都很好,您可以在输出图片中看到这一点。我希望你明白我的意思。也非常欢迎任何有关改进代码的提示。提前致谢:)

代码:

#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);
}

输出: Output

evenArr = realloc(evenArr, sizeof(evenArr) + sizeof(int)); 是不正确的,因为它总是分配相同的大小,因为 sizeof(evenArr) 是常量。你想要:

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

并且您还需要正确地增加 evenArrSize。就像,你需要在调用 realloc 之前增加它,而不是之后。尽管对每个数据点递增 1 并重新分配有点不典型。一种常见的模式是仅在需要时将大小加倍,或者增加大于 1 的块大小。

您没有使用 realloc() 正确地增长数组。

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

sizeof(oddArr)是指针的大小,不是它指向的数组的大小。因此,每次调用 realloc() 时,您都在分配相同大小的数组,而不是增加大小。

需要:

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

你必须对偶数数组做同样的事情。