Я вижу несколько проблем здесь.Вы не должны определять массивы с непостоянным значением, таким как переменная n , которую вы указали пользователю для ввода.
Обычно, когда вы определяете массив с постоянным значением, для вашего массива создается ровно столько пробелов.Давайте посмотрим на это, например:
#define MAX 100
<...>
int array[MAX];
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%d", &array[i]);
<...>
Мы только что создали целочисленный массив с константой, определенной как MAX, с 100 неопределенными пробелами, но с помощью цикла for нам удалось заполнить пробелы в первых n индексах.,Например, если n равно 20, остальные 80 пробелов останутся случайными значениями, взятыми из памяти (мусор, скорее всего, -84134 ...).Это также статическая память, используемая стеком.
Это нормально, но вы можете динамически распределить достаточно места (пространство, как в простом выражении, области памяти) с помощью функции, вызываемойmalloc (), чтобы убедиться, что вам достаточно для n чисел.
int n;
printf("How many numbers? ");
scanf("%d", &n);
// User inputs values into array the size of array[n]
int i;
int *array = (int*)malloc(n * sizeof(int));
printf("What are the numbers?\n");
for(i=0; i<n; i++) scanf("%d", &array[i]);
Теперь мы использовали функцию malloc (), чтобы создать достаточно места.Malloc используется для выделения динамической памяти в куче, а не в стеке.
Определение самой функции таково:
void *malloc(size_t size)
malloc () возвращает пустой указатель нановый блок памяти вы сказали ему создать.Он имеет только один параметр, и это размер нового блока в байтах, который рассчитывается путем взятия необходимого количества «пробелов» и умножения их с помощью оператора sizeof .
Однако указатель на новый блок памяти должен быть приведен к соответствующему типу, и в этом случае это целочисленный указатель.
int *array = (int*)malloc(n * sizeof(int));
Итак, самый простой способ поместить его: сделать указатель-> иметь malloc для динамического выделения памяти для вас -> приведите ее к соответствующему типу, и вуаля, у вас есть массив с достаточным количеством пробелов.
Теперь давайте перейдем к самой задаче: мой дубль будетсначала подсчитывая, сколько существует четных и нечетных чисел, сохраняя их в отдельных целочисленных переменных, а затем динамически выделяя достаточно места для такого количества нечетных и четных чисел.
Окончательное решение:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("How many numbers? ");
scanf("%d", &n);
int i, odd = 0, even = 0, counter_odd = 0, counter_even = 0;
int *array = (int*)malloc(n * sizeof(int));
printf("What are the numbers?\n");
for(i = 0; i < n; i++) scanf("%d", &array[i]);
// Counting how many odd and even numbers there are
for(i = 0; i < n; i++) {
if(array[i] % 2) odd++;
else even++;
}
int *even_array = (int*)malloc(sizeof(int) * even);
int *odd_array = (int*)malloc(sizeof(int) * odd);
// Placing the numbers in separate arrays
for(i = 0; i < n; i++) {
if(array[i] % 2) odd_array[counter_odd++] = array[i];
else even_array[counter_even++] = array[i];
}
// Printing them out
printf("\nOriginal array: ");
for(i = 0; i < n; i++) printf("%d ", array[i]);
printf("\nOdd array: ");
for(i = 0; i < odd; i++) printf("%d ", odd_array[i]);
printf("\nEven array: ");
for(i = 0; i < even; i++) printf("%d ", even_array[i]);
return 0;
}
И контрольный пример:
How many numbers? 5
What are the numbers?
1
2
3
4
5
Original array: 1 2 3 4 5
Odd array: 1 3 5
Even array: 2 4