Как создать динамический массив в c
Перейти к содержимому

Как создать динамический массив в c

  • автор:

Динамический массив символов в C [дубликат]

Как создать динамический массив символов (размер массива определяется в процессе ввода) в С?

Отслеживать

задан 20 фев 2020 в 8:00

1 1 1 бронзовый знак

20 фев 2020 в 8:06

20 фев 2020 в 8:07

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

В самом языке Си нет динамических массивов, но функции стандартной библиотеки malloc, free и realloc позволяют реализовать массив переменного размера:

 int *mas = (int*)malloc(sizeof(int) * n); // Создание массива из n элементов типа int . mas = (int*)realloc(mas, sizeof(int) * m); // Изменение размера массива с n на m с сохранением содержимого . free(mas); // Освобождение памяти после использования массива 

Неудобство данного подхода состоит в необходимости вычислять размеры выделяемой памяти, применять явное преобразование типа и тщательно отслеживать время жизни массива (как и всегда при работе с динамически выделенной памятью в Си).

Как создать динамический массив?

Хочу разобраться с динамическим выделением памяти в c. Пришла в голову идея, попробовать сделать программу, которая спрашивает у пользователя имя и записывает ввод в массив типа char , но так чтобы массив сам выделял себе память. То есть без предварительного выделения вида char name[30] = ; . Я ввожу имя Магомед и массив сам выделяет себе память на 7 символов. Как это сделать?

Отслеживать
29k 14 14 золотых знаков 61 61 серебряный знак 119 119 бронзовых знаков
задан 2 янв 2017 в 18:24
187 1 1 серебряный знак 12 12 бронзовых знаков

Плохо гуглили, ибо это — основы, которые есть в любом учебнике или справочнике. Вы хотите чтобы их здесь зачитали вам вслух? OK. 1) определем сколько памяти нужно выделить 2) выделяем её 3) в любом случае массив «сам себе» выделить ничего не может, это забота программиста.

2 янв 2017 в 18:28
Я понял. Выходит в С нельзя сделать так. «Не выделел память умер!»
2 янв 2017 в 20:25
Что значит «массив сам выделял себе память»?
2 янв 2017 в 20:44
Я уже понял что так не получится
2 янв 2017 в 20:47
Возможный дубликат вопроса: Как динамически создать массив, не зная количества его элементов?
10 июн 2017 в 15:46

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Я бы взял указатель, длину и зарезервированную длину. Примерно

char * s = malloc(16); int size = 16; int used = 0; 

И дальше читаем по одному символу. Как только вносим его в s , тут же увеличиваем used ; как только used == size , так сразу увеличиваем массив раза в два:

s = realloc(s,size *= 2); 

И все. Мы всегда знаем, сколько места имеется, сколько занято. Как в векторе в C++.

Отслеживать
ответ дан 4 янв 2017 в 17:56
12.6k 2 2 золотых знака 19 19 серебряных знаков 46 46 бронзовых знаков
Дайте пример кода.
8 янв 2017 в 19:27

Вот есть функция, которая прочитывает указанный файл посимвольно, пока не встретит символ перевода строки или конец файла. Функция сама выделяет себе память, а после использования строки буфер надо освободить с помощью free . При нехватке памяти ввод обрывается и возвращаются считанные символы или NULL , если не удалось ничего получить. Кроме того, для удобства чтения стандартного ввода предлагается макрос.

char* get_full_line(FILE* f) < size_t capacity = 16; // начальный объем массива char* str = malloc(capacity); size_t length = 0; if (!str) return NULL; int ch; while ((ch = fgetc(f)) != '\n' && ch != EOF) < if (length >= capacity) < char* p = realloc(str, capacity *= 4); // коэфициент прироста if (!p) break; str = p; >str[length++] = ch; > str[length] = '\0'; return str; > #define read_full_line() ( get_full_line(stdin) ) 

Динамический массив С: определение, как создавать, структуры и удаление

Lorem ipsum dolor

Как выглядит создание одномерного динамического массива в С в коде? С оздаем небольшую программку:

int main()

setlocale(0, «»);

int n;

cout

cin >> n;

cout

int *dynamic_array = new int [n]; // происходит создание динамического массива

for (int i = 0; i < n; i++)

cin >> dynamic_array[i]; // считываются числа в элементах массива

>

cout

for (int i = n — 1 ; i >= 0; i—)

cout

>

cout

delete [] dynamic_array; // происходит удаление динамического массива

return 0;

>

Результат выполнения программы будет следующий:

Определите количество чисел, которое вы будете вводить: 6

Нужно ввести 6 чисел: 3 5 7 9 17 21

Выводим числа массива в обратном порядке: 21 17 9 7 5 3

Теперь массив удаляется!

Как создать дв ум ерный динамический массив в Си

Дв ум ерный динамический массив в С создается по похожему шаблону, что и одномерный:

** = new * []

Однако нужно отметить , что появился еще один оператор « * » перед именем массива и после типа переменной. Также к созданию такого рода массивов подключается цикличный оператор « for » .

Как дв ум ерный массив выглядит в коде:

#include

using namespace std;

int main()

setlocale(0, «»);

int **dynamic_array2 = new int* [6]; // создается дв ум ерный динамический массив

for (int i = 0; i < 6; i++)

dynamic_array2[i] = new int [i + 1];

>

for (int i = 0; i < 6; i++)

cout

for (int x = 0; x < i + 1; x++)

cin >> dynamic_array2[i][x];

>

>

for (int i = 0; i < 6; i++)

int total = 0;

for (int x = 0; x < i + 1; x++)

total += dinamic_array2[i][x];

>

cout

>

for (int i = 0; i < 6; i++)

delete [] dynamic_array2[i]; // удаляется массив

>

system(«Пауза»);

return 0;

>

Этот код создает двумерный массив, потом заполняет его значениями, потом подсчитывает и выводит сумму значений всех массивов. В конце массив удаляется.

Заключение

Динамический массив в С реализуется довольно часто в тех случаях, когда заранее трудно предугадать количество элементов массива или количество памяти для его обработки. Реализация динамического массива не так сложна , и от создания статического массива его отделяет пара собственных « штрихов » . Однако ф ункциональн о д инамический массив в Си способен выручит ь во многих нестандартных ситуациях.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Как создать динамический массив C?

Необходимо прочитать из файла число N, создать массив NxN и полностью инициализировать его 1-ми. Вот как я делаю это на C++:

int **Graf, i, j, N; ifstream input("Graf.txt"); input >> N; Graf = new int *[N]; for(i=0; i>i>>j; Graf[i][j]=1; Graf[j][i]=1; > 

Как это перевести на C?
Отслеживать
задан 28 окт 2013 в 17:46
Adam Shakhabov Adam Shakhabov
3,847 8 8 золотых знаков 34 34 серебряных знака 88 88 бронзовых знаков
@derkode а можно узнать для каких целей для работы с файлами Вы используете чистый Си?
28 окт 2013 в 18:15

Не знаю может это звучит глупо!) Но мне это нужно для Objective-C. Я в Xcode делаю консольное приложение для Mac OS. Что-то родного для двумерного массива в Objective-C я не нашел и решил использовать C, т.к. Objective-C его полностью поддерживает.

28 окт 2013 в 18:31

Я конечно не эксперт в Objective-C но по моему там существует NSArray. И еще: arrayWithArray: Creates and returns an array containing the objects in another given array. + (instancetype)arrayWithArray:(NSArray *)anArray Parameters anArray An array. Return Value An array containing the objects in anArray. Availability Available in OS X v10.0 and later.

28 окт 2013 в 18:39
Цикл с предусловием !eof — практически всегда ошибка и в С, и в С++.
16 мар 2017 в 7:53

4 ответа 4

Сортировка: Сброс на вариант по умолчанию

Graf = new int *[N]; 
Graf = (int**) malloc(N * sizeof(int*)); 
Graf[i] = new int[N]; 
Graf = (int*) malloc(N * sizeof(int)); 

Освобождение памяти для такой матрицы будет выглядеть так

for(i = 0;i < N;++i) free(Graf[i]); free(Graf); 

Ну и плюс ко всему нужно подключить stdlib.h

Отслеживать
ответ дан 28 окт 2013 в 18:34
291 1 1 серебряный знак 12 12 бронзовых знаков

Ругается на строку "Graf = (int*) malloc(N * sizeof(int));" cообщением: Incompatible pointer types assigning to 'int **'from 'int *'

28 окт 2013 в 19:02

@derkode, видимо звездочек в приведении типа (cast operation) не хватает. Надо точно так, как @Че Гевара написал. int Graf = (int)malloc(N * sizeof(int*)); А еще, открою Вам страшную тайну, такая конструкция на самом деле не является двумерным массивом (не все ее элементы лежат в памяти подряд), хотя для операций доступа по индексам она выглядит хорошо. Настоящий динамический двумерный массив с индексацией типа a[i][j] в Си сделать нельзя. Обычно все такие матрицы просто моделируют одномерными массивами int matr = (int *)malloc((M * N) * sizeof(int)); matr[iN + j] = 1;

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *