Stack Overflow на русском Asked by MrKreter_ on February 7, 2021
писал я тут большую программу с разными сортировками, все сделал, все работает. Кроме того, что компилятор выдает предупреждение, мол в стеке слишком много байт(не удивительно, так-то, 3 статических массива по 5000 элементов задаю). Мне как-то объяснили, что нужно использовать динамические массивы. Я, вроде, понял, что это такое, но как использовать на практике -не очень. Я написал программу с одной сортировкой, буду рад, если покажете, как заменить массив на динамический.
#include <stdio.h>
#include "locale.h"
#include "stdbool.h"
void printArray(int A[], int* n)
{
int i;
for (i = 0; i < *n; i++)
printf("%d ", A[i]);
printf("n");
}
void writeArray(int A[], int B[], int* n)
{
int i;
printf("-----------Обьявление массива-----------n");
printf("Введите размер массива:n");
scanf_s("%d", &*n);
printf("Наберите массив:n");
for (i = 0; i < *n; i++)
scanf_s("%d", &A[i]);
printf("Массив: ");
printArray(A, n);
printf("-----------Массив объявлен -------------n");
for (i = 0; i < *n; i++)
B[i] = A[i];
}
void BubbleSort(int A[], int* n)
{
int i, j;
int tmp, bsw = 0, bco = 0, NO = 0;
printf("-----------Сортировка массива пузырьком-----------n");
printf("Массив на входе: ");
printArray(A, n);
bool this;
for (i = 0; i < *n; i++)
{
this = true;
for (j = 0; j < *n - i - 1; j++)
{
if (A[j] > A[j + 1])
{
tmp = A[j];
A[j] = A[j + 1];
A[j + 1] = tmp;
this = false;
}
}
if (this == true) break;
}
printf("Готовый массив: ");
printArray(A, n);
}
int main()
{
setlocale(LC_ALL, NULL);
setlocale(LC_CTYPE, "Russian");
int n;
int A[3000];
int B[3000];
writeArray(A, B, &n);
BubbleSort(A, &n);
printf("-----------Массив отсортирован-----------n ");
}
Динамическая память выделяется в куче, когда обычный массив на стеке.
Пример создания динамического массива int:
#include <stdlib.h> // для функций calloc и malloc
unsigned int elements_amount = 5000; //количество ваших элементов
// выделение памяти без инициализации
int *dyn_array = (int*)malloc(elements_amount * sizeof(int));
// выделение памяти инициализированной нулями
int *dyn_array2 = (int*)calloc(elements_amount, sizeof(int));
//далее можно с dyn_array2 работать как с обычным массивом, например
// dyn_arrya2[10] - обращение к 10-му элементу
// после использования выделенную память необходимо почистить
free(dyn_arrya2);
free(dyn_array);
Answered by MikitaS on February 7, 2021
Динамический массив, это массив, размер которого заранее неизвестен. Память будет выделена под массив по мере необходимости. В Вашем случае нужен не совсем динамический массив, а массив, под который будет выделена память в процессе выполнения программы.
int *A;
int *B;
...
void writeArray(int *A, int *B, int* n)
...
printf("Введите размер массива:n");
scanf_s("%d", &*n);
/*Выделяем память под A*/
A = malloc(sizeof(int) * n);
printf("Наберите массив:n");
...
/*Выделяем память под B*/
B = malloc(sizeof(int) * n);
Answered by koma on February 7, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP