Максим
Искусственный Интеллект
(212915)
3 года назад
Массив это не одно число, это потенциально большая структура данных. Там может храниться множество элементов, десятки, сотни, тысячи. Нужно понимать, что с точки зрения памяти ты пытаешься скопировать массив целиком. Он будет в памяти присутствовать дважды. Поэтому без копирования массива здесь не обойтись, что может быть затратным. При указателе, что логично, это уже будет не копия, а тот же массив в памяти.
kh fjkgЗнаток (323)
3 года назад
Мой интерес пока что не в затратности памяти, а в изучении.
А задание под такое действие придумать можно. Когда нужна именно 2 одинаковых массива. А не ссылка на один массив.
Простого решения я не нашёл. Предлагают только поэлементно копировать массив циклом.
Батаев Дмитрий
Просветленный
(22877)
3 года назад
Какую ересь ты несёшь!!!! Как можно ПРИРАВНЯТЬ массивы как и переменные? Их ИНИЦИАЛИЗИРУЮТ, то есть переменная получает ЗНАЧЕНИЕ правосторонней переменной
Батаев ДмитрийПросветленный (22877)
3 года назад
А через указатели ты получаешь возможность использовать массив уже созданный и корректировать его значения можно через два указателя, который ссылается на одну область памяти, а не его копию. Через цикл поэлементно можно создать такой же массив, то есть копию в другой области памяти
kh fjkgЗнаток (323)
3 года назад
А я думал почему только справа налево оно работает. Ок. Вообще то я так и думал. Просто пока выражаюсь плохо. Вторую неделю учу Си.
А по вопросу можете ответить?
kh fjkgЗнаток (323)
3 года назад
Через цикл, это опять же надо каждый элемент массива друг другу присваивать. Я в сообщении привёл пример как я разом передал весь массив без цикла.
kh fjkgЗнаток (323)
3 года назад
Дело не в конкретном примере. Дело в том что мне надо сделать то что я описал в вопросе. Для обучения.
Я так понял вы описали пример с утечкой памяти и ошибкой. Мне надо без ошибок.
Один из таких примеров я описал в своём вопросе. Я передал массив другому массиву через функцию.
Да, передал я указатель, это правда, но без звёздочек, что мне и нужно было. Можно такое же сделать без функции?
kh fjkgЗнаток (323)
3 года назад
Вы напечатали копию моего кода. Я имел в виду без функции надо обойтись и присвоить левому массиву правый массив.
kh fjkgЗнаток (323)
3 года назад
Пока что никуда передавать не надо. Нужно сначала разобраться как левому массиву присвоить значение правого.
kh fjkgЗнаток (323)
3 года назад
Примерно понимаю. В одном массиве было миллион символов, в другом 1. Это разная выделенная память. Но у меня ведь как то получилось.
kh fjkgЗнаток (323)
3 года назад
В данном случае будет не использовано лишнее пространство в массиве massiv?
Указатель arr присваивается указателю massiv.
Или теперь arr не использовано и забыто?
void func(int massiv[] ) { }
int main() {
int arr[]= { 1,2,3,4,5 } ;;
func(arr);
return 0;
}
kh fjkgЗнаток (323)
3 года назад
Я так и написал. Указатель. Адрес. Да, я правильно это понимаю.
kh fjkgЗнаток (323)
3 года назад
Я об этом вашем сообщении пишу
-----------------------------------------------
ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указательна первый элемент массива содержится в двух переменных - НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
-----------------------------------------------------------
Непонятно какую область памяти забыли безвозвратно. Какого массива. Уточнение нужно чтоб полностью понять
kh fjkgЗнаток (323)
3 года назад
-------------------------------------
void func(int *arr) и void func(int arr[ ]) АНАЛОГИЧНЫ
-------------------------------------
arr будет указателем потому что в ней хранится адрес.
Но сейчас не об этом.
kh fjkgЗнаток (323)
3 года назад
Можете пожалуйста объяснить это сообщение?
-------------------------------
ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указатель на первый элемент массива содержится в двух переменных - НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
-------------------------------
Я выделил два массива arr[] и massiv[]. Потом указатель arr содержится и в arr и в massiv(massiv тоже является указателем).
Моя потеря заключается только в 4 Байт? Столько занимает int в стеке.
kh fjkgЗнаток (323)
3 года назад
Это называется утечкой в памяти? Я бы назвал это просто нерациональным использованием памяти. 4 байта потеря всего, но зато как быстро передался массив.
kh fjkgЗнаток (323)
3 года назад
То что это псевдоним я написал в своём вопросе выше. Вы пытаетесь мне это "объяснить", потому что я неправильно выразился. Ок.
Про адреса и псевдонимы я знаю. Это как уже я сказал было сказано в вопросе, да криво, но сказано.
Сначала вы говорите что там что то теряется, сейчас уже ничего не теряется.
kh fjkgЗнаток (323)
3 года назад
-----------------------------------------------
ЭТО утечка памяти. Ты выделил ДВА массива в памяти. А потом указательна первый элемент массива содержится в двух переменных - НА ОДНУ ОБЛАСТЬ ПАМЯТИ. А вторую забыли безвозвратно
------------------------------------------------
kh fjkgЗнаток (323)
3 года назад
Под словом теряется я имел в виду что нерационально используется. )) Сори)
kh fjkgЗнаток (323)
3 года назад
Если я ничего не теряю, то значит буду использовать эту функцию дальше.
Только мне ещё нужен способ присвоить левому массиву правый массив.
user49913
Просветленный
(38741)
3 года назад
https://stackoverflow.com/questions/5573310/difference-between-passing-array-and-array-pointer-into-function-in-cто, что у тебя "получилось" с функцией, по сути эквивалентно варианту со звёздочкой, который ты выше по тексту хотел избежать
не понимаю, что не так с поэлементным присваиванием, на самом деле это единственный правильный вариант
если хочется, можно (и даже нужно) заюзать стандартную функцию типа memcpy
kh fjkgЗнаток (323)
3 года назад
Сейчас замечаю что так оно и есть.
Почему тогда без звёздочки вне функции не получается.
В функции получается без звёздочки, а без функции не получается.
Что то типа этого:
int arr[]={1,2,3,4,5};
int massiv[] = arr;
С массивами так же не получается. int arr[10]; int massiv[10]; arr=massiv; Так не получается.
Нужно не сохранить адрес массива в указателе,
Вот так:
int arr[]={1,2,3,4,5,6};
int *ukazatel = arr;
Это не надо.
Нужно если возможно обойтись без указателей (звёздочек).
Я спрашиваю, потому что у меня нечто подобное получилось, только я не понял как.
Получилось передать в функцию массив и загрузить этот массив в пустой массив функции.
Так:
void func(int massiv[]/*Загружаю в указатель в пустой массив. */ ){ }
int main() {
int arr[]={1,2,3,4,5};;
func(arr); // Передаю arr указатель на массив в функцию.
return 0;
}
Можно подобное сделать не используя функций. По простому, примерно так же как переменные друг другу присваивают?