Динамический массив символов в 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) )
Динамический массив С: определение, как создавать, структуры и удаление
Как выглядит создание одномерного динамического массива в С в коде? С оздаем небольшую программку:
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;