Как передать одномерный массив в функцию c
Перейти к содержимому

Как передать одномерный массив в функцию c

  • автор:

Передача одномерных массивов в функции

При передаче одномерных массивов в функции следует вызывать функцию с именем массива без индекса. В результате этого передается адрес первого элемента массива. В С невозможно передать весь массив как аргумент. Вместо этого автоматически передается указатель. Следующий пример передает адрес i в func1();

Если функция получает одномерный массив, то можно объявить формальный параметр как указатель, как массив с фиксированной длиной или как безразмерный массив. Например, для передачи i в функцию func1() можно объявить func1() одним из следующих способов:

void fun1(int a[10]) /* массив с фиксированной длиной */
.
>

void fun1(int a []) /* безразмерный массив */
.
>

Все три способа объявления сообщают компилятору, что предполагается получение указателя на целое, В первом объявлении используется указатель. Во втором — стандартный способ объявления массива. В третьем — модифицированная версия объявления массива, указывающая на то, что предполагается получение массива типа int некоторой длины. Не имеет значения длина передаваемого массива, поскольку С не выполняет проверку выхода за границы массива. Фактически

также будет работать, поскольку компилятор создает код, указывающий func1() о получении указателя (на самом деле не создается 32-элементный массив).

Как передать одномерный массив из функции его формирования в функцию его вывода?

whatislov , блочность кода в твоих примерах страдает катастрофически. Код нечитаем. Тебе стоит сделать исправления своего кода чтобы его можно было читать.

int func (int **mas, int n)
Почему тип результата функции у тебя именно такой? Как ты можешь обосновать необходимость именно такого типа результата?

return masb[i];
Почему результат возвращается именно таким выражением? Тут у тебя Buffer Overrun [?] присутствует.
Как ты можешь оправдать необходимость именно такого выражения для формирования результата функции?

Сейчас вызов func приводит к утечке памяти. Как ты можешь это исправить?

Как передать одномерный массив из одной функции в другую?

Добрый день! Как передать одномерный массив из одной функции в другую? У меня есть функция формирования массива и функция печати массива. Как мне передать массив из одной в другую, чтобы напечатать его?

  • Вопрос задан более двух лет назад
  • 101 просмотр

1 комментарий

Простой 1 комментарий

Евгений Шатунов @MarkusD Куратор тега C++

whatislov , дублирование вопросов запрещено П4.1 регламента работы сервиса.
Для получения ответа тебе следует продолжить обсуждение в оригинальном вопросе.

Решения вопроса 0
Ответы на вопрос 1
Wataru @wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.

Если это, таки, С++, то используйте std::vector. Одна функция его создает и возвращает, другая печатает.
Чтобы не было лишнего копирования передавайте как константную ссылку:

std::vector MakeArray(); void Print(const std::vector array);

Если надо работать с сишными массивами, то тогда придется длину возвращать отдельно через выходной параметр. Передавайте как указатель + длина.

int* MakeArray(int *len); void Print(int *array, int len);

Передача статического одномерного массива определённого размера в функцию

Я хочу передать в функцию статический массив определённого размера, который будет проверяться при компиляции.

#include void print(int arr[3]) < std::cout std::cout int main() < int staticArr2[2] = ; int staticArr3[3] = ; std::cout 

Но вот конструкция int arr[3] воспринимается как int * в объявлении входных параметров функции. Подскажите, как можно реализовать передачу массива конкретного размера.

Отслеживать
32.1k 19 19 золотых знаков 80 80 серебряных знаков 106 106 бронзовых знаков
задан 18 дек 2015 в 15:24
53 1 1 серебряный знак 5 5 бронзовых знаков
Прекрасный вопрос, кстати!
18 дек 2015 в 19:15

6 ответов 6

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

Можно воспользоваться шаблонами для того, чтобы передавать массив как массив, а не как указатель. При таком вызове сохраняется информация о размере массива. Если дополнить код вызовом static_assert , то ошибка будет выдаваться во время компиляции.

template void print(int (&arr)[N]) < static_assert(N == 3, "Array must contain 3 elements"); // Проверка выполняется // во время компиляции std::cout std::cout

При попытке передать массив из двух элементов будет выведена ошибка:

prog.cpp: In instantiation of 'void print(int (&)[N]) [with unsigned int N = 2u]': prog.cpp:22:21: required from here prog.cpp:6:2: error: static assertion failed: Array must contain 3 elements static_assert(N == 3, "Array must contain 3 elements"); ^ 

Отслеживать
ответ дан 18 дек 2015 в 15:41
32.1k 19 19 золотых знаков 80 80 серебряных знаков 106 106 бронзовых знаков

Большое спасибо. Такую шаблонную конструкцию можно воспринимать только как с++ магию, или здесь есть какая то логика? Подскажите пожалуйста, где можно найти дополнительную информацию об этом.

18 дек 2015 в 15:46

@Rekiro Что считать магией, а что нет — это решает каждый сам для себя. Стандартная библиотка, boost и прочие привычные вещи понапичканы мозговыносящими конструкциями на шаблонах — они становятся из-за этого магией? Ну а вычисление размера массива с помощью такого шаблона есть в VC++ в виде _countof . stackoverflow.com/q/4108313 На вопрос "почему" во всех деталях, к сожалению, ответить не могу. Обычно ответ звучит как "потому что стандарт такой", а я ни разу не специалист по нюансам стандарта.

18 дек 2015 в 15:54

@Discord, ну и как этим пользоваться? Сделайте законченый рабочий пример (думаю, Вы сами убедитесь, что кресты это бред).

18 дек 2015 в 16:03

@avp Не понял. Что значит "как пользоваться"? Вызовы этой функции есть в вопросе. Про бред вообще не понял. вы же плюсовик? о_О

18 дек 2015 в 16:05
Пример с main, который компилируется и печатает значение sizeof. (а я не не "плюсовик", а "сишник").
18 дек 2015 в 16:07

Конкретный размер передается отдельным параметром.

В функцию надо передавать два параметра:

  • ссылку на первый элемент массива (это имя массива без квадратных скобок
  • размерность массива.

Отслеживать
ответ дан 18 дек 2015 в 15:30
user453575457 user453575457
2,947 2 2 золотых знака 20 20 серебряных знаков 42 42 бронзовых знака

По логике программы функция знает массив какой размерности ей передаётся. И поэтому мне необходимо чтобы передавался именно массив, а не указатель

18 дек 2015 в 15:33

"Именно массив" это и есть указатель на ячейки памяти в которых хранятся данные, это можно сказать разновидность указателя.

18 дек 2015 в 15:34

Если уж так надо именно определенный один объект передать - можно и в структуру и в вектор и в список массив затолкать и много куда еще, и передавать уже этот объект. Но у вас я так понимаю задача не в этом, а в простой обычной передаче. Так вот просто и обычно - передать указатель/ссылку.

18 дек 2015 в 15:38

можно завернуть массив в структуру и передавать экземпляр структуры в качестве аргумента функции:

struct Array3 < int items[3]; >; void print(struct Array3 arr) < // code here >

Отслеживать
ответ дан 18 дек 2015 в 15:34
Vitali Falileev Vitali Falileev
374 1 1 серебряный знак 5 5 бронзовых знаков

Только надо не забывать, что такой массив будет передаваться "по значению" (в стек будет записана его копия) и соответственно все изменения будут утеряны (если не возвращать его обратно и не присваивать оригиналу). Однако, действительно, этот метод с небольшой модификацией можно использовать, если передавать в функцию адрес структуры.

18 дек 2015 в 15:53

А Вы надеялись увидеть 12?

С т.з. языка аргумент функции, хоть и описывающий массив с указанием размера все равно является указалем.

И ведь на самом же деле в функцию в стеке (или в некоторых архитектурах в одном из регистров) передается указатель, который в 32-bit системах имеет размер 4 байта (которые Вы и видите на печати).

Причем, даже в gcc, который "на самом деле понимает" размеры массивов (точнее низшие размерности многомерных массивов), например, вот такой код --

int f (int m, int n, int a[m][n]) < printf("n = %d a[n] = %ld\n", n, (long)sizeof(a)); int i, j; for (i = 0; i < m; i++) for (j = 0; j < n || !puts(""); j++) printf("%d ", a[i][j]); // обратите внимание он (компайлер) в самом деле учитывает количество элементов в строке матрицы. return 0; >int main (int ac, char *av[]) < static int c[2][5] = < , >; f(2, 5, c); > 

все равно sizeof(a) выдает 4.

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

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