TransWikia.com

Си, динамические массивы

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

2 Answers

Динамическая память выделяется в куче, когда обычный массив на стеке.

Пример создания динамического массива 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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP