为什么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));
你必须对偶数数组做同样的事情。
我编写了一个程序,将一个带整数的主数组分成两个动态分配的奇数和偶数数组。
除了奇数数组和偶数数组中的一个元素外,一切都很好,您可以在输出图片中看到这一点。我希望你明白我的意思。也非常欢迎任何有关改进代码的提示。提前致谢:)
代码:
#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));
你必须对偶数数组做同样的事情。