Структуры — передача оных в функцию и обратно.
Доброго времени суток! Страшно извиняюсь, но не смог подобрать под нижеописанное верный запрос в поисковиках.
Как видно из кода — хочу в функцию передать структуру, забить в нее данные и вернуть без мусора. Однако, либо сегфолт, либо не компилится. Этот вариант нагляден, но не работает, хоть и собирается. Подскажите пожалуйста, как разрулить видимости. Спасибо, товарищи!


Кто будет память выделять под структуру?

не 1 и 3, а malloc и malloc, а потом уже 1 и 3 ну и как уже заметили
Кто будет память выделять под структуру?


Удваиваю этот способ. Malloc без причины — признак альтернативности мышления.

Вы же так любите оптимизатор, дак люзайте его как опмошника, а не как оптимизатор лалкакода.



ничего, что структура на входе в функцию скопируется?
ты это компилировать пробовал, профи

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

Непросто в коде joy4eg поймать мусор, однако.

Спасибо за наглядность, добрый человек!

Отличается только тем, что в структуре указатели на int, сейчас трудно проверить старую версию, так как до треда перевернул все структуры и переменные в глобальные, а заново неправильно делать лень. В функции работало нормально по struct->var, а вот вне ее по struct.var = мусор. Плюс структура == вместилище переменных GKeyFile’а, со всеми вытекающими — тут я вижу что делаю, а там неизвестно как что написано.

Ты когда его забанишь?
Что такое «лалка» вообще? Мне так кажется, что это оскорбление

что в структуре указатели на int
А под них память была выделена ?
Еще нужно было эти указатели разыменовывать перед присваиванием (например, *a = 1), в противном же случае, Вы записываете туда адрес, а по этому адресу может быть что угодно, в том числе и Ваш мусор 🙂

Начнем с того: тебе её на стеке нужно или в куче?

вообще-то я думал, что в структуре будет храниться, что-то отличное от int. но если был не прав, то все гораздо проще:

Ну замени стрелочку на точку — это не приципиально. Нет, она не скопируется.
с -O3 выхлоп, как и ожидался, 0,0. //Хотя я знаю, что это вброс. 🙂

Скопируется, скопируется. Структуры тоже в стек по значению передавать можно. Марш учебники читать!

Да, там и gchar * var есть, так что я снова у корыта
Ну что же ты так по-слоновьи разрушаешь такой замечательный образ? А я верил в тебя.

gchar определен как typedef char gchar;


stdlib.h — вторая сверху.
а варнинг там другой:
$ cc minakov.c -o minakov —std=c99
minakov.c: In function ‘testing’:
minakov.c:13:2: warning: implicit declaration of function ‘strnlen’ [-Wimplicit-function-declaration]

Я о том, что кастить malloc не надо. Для меня вообще загадка, почему это многие всё ещё делают.

дык «так повелось» %)
к тому же, лишняя предосторожность. хорошо для более реальных ситуаций, я думаю

Потому что якобы так легче это потом портировать на Плюсы, где автокаста из void* нет.
Для меня бо́льшая загадка, почему в sizeof malloc’а продолжают вбивать тип, а не *<тот указатель, что слева от присваивания>.

Дануладно — я с просоня недописал то, что хотел, а вы на меня накинулись.
да там нужен ретурн и присваивание для такой функции.
А со структурами фейл, ибо структуры больше, чем с 2 или 3-мя елементами конпелятор не умеет раскидывать по регистрам вменяемо. Объясни мне почему, я уже давно хотел узнать.
Я перерыл всё аби amd64, мануал гцц, но так и не нашел причины, почему он 2елементра передаёт вменяемо через регистры, а для после 3-4 юзает тухлыйтек.
Ну и да — стек не нужен.
за void main уже не сажают?

Тогда для тебя будет открытием, что параметры не везде передаются через регистры. В *BSD, например, параметры передаются только через стек. А вопрос о том, что из этих двух подходов быстрее, вообще открытый.

Второе по-моему ортогонально. Лично я предпочитаю тип, а не два раза переменную писать.
Структуры. Передать динамическую структуру в функцию
В принципе структуры – это почти классы и все что есть у классов, все есть у структур. Но есть такие пользователи, которые классов побаиваются.
Код С++ Передача динамической структуры в функцию
=====================
#include <iostream.h>
#include <stdlib.h>
int n ; //Переменная для числа элементов структуры
//Некоторая структура
struct MyStruct
<
char Name [ 20 ];
int age ;
>;
//Чтоб под объекты структуры можно было выделить память, указываем их как указатели
MyStruct * X ; //Указатель X на структуру MyStruct
/*ФУНКЦИЯ ВВОДА ЭЛЕМЕНТОВ В ДИНАМИЧЕСКУЮ СТРУКТУРУ*/
void input (int i , MyStruct * X )
<
cout << “Имя: “ ;
cin . getline ( X [ i ]. Name , 20 ); //Записываем данные в структуру
cout << “Возраст “ ;
cin >> X [ i ]. age ; //Записываем данные в структуру
cin . ignore ();
cout << “\n” ;
>
/*ФУНКЦИЯ ВЫВОДА СТРУКТУРЫ НА ЭКРАН*/
void output (int i , MyStruct * X )
<
cout << X [ i ]. Name << ” “ << X [ i ]. age << endl ; //Выводим все поля структуры X
>
//===============
void main ()
<
system ( “CLS” ); //Очистка экрана
cout << “N = “ ; cin >> n ; //Вводим число структур
X =new MyStruct [ n ]; //Выделяем память под указанное число структур
for (int i = 0 ; i < n ; i ++) input ( i , X ); С помощью цикла заполняем структуру
for ( i = 0 ; i < n ; i ++) output ( i , X ); С помощью цикла выводим поля структуры на экран
delete [] X ; //Освобождаем память
cin . get ();
>
=================
Вот приблизительно такой код можно использовать для передачи динамической структуры в функцию.
Передача структур в функции
У меня возникли проблемы с пониманием того, как передать структуру (по ссылке) в функцию, чтобы можно было заполнить функции-члены структуры. Пока что я написал:
Я получаю ошибку:
C ++ требует спецификатора типа для всех объявлений
bool data (const &testStruct)
Надеюсь, кто-нибудь может мне помочь.
Решение
Во-первых, подпись вашей функции data ():
не может работать, потому что аргумент не имеет имени. Когда вы объявляете аргумент функции, к которому вы намерены обратиться, ему нужно имя. Так что измените его на что-то вроде:
Но в C ++ вам не нужно использовать struct вообще-то на самом деле. Так что это может просто стать:
Во-вторых, sampleData Структура не известна data () в этот момент. Поэтому вы должны объявить это до этого:
И, наконец, вам нужно создать переменную типа sampleData , Например, в вашей функции main ():
Обратите внимание, что вам нужно передать адрес переменной в функцию data (), так как она принимает указатель.
Однако обратите внимание, что в C ++ вы можете напрямую передавать аргументы по ссылке и не нужно «эмулировать» его указателями. Вы можете сделать это вместо этого:
Другие решения
Вы должны сообщить методу, какой тип структуры вы используете. В этом случае sampleData.
Примечание. В этом случае вам необходимо определить структуру до того, как метод будет распознан.
Примечание 2: я парень С Для этого может существовать более простой способ на С ++.