Другие языки программирования и технологии

Си, структуры и функции

Нужно через вызов функции создать объект структуры и вернуть его. Можно ли делать так, как ниже?
Person Person_init(char* name, double money) {
Person prs;
prs.name = name;
prs.money = money;
return prs;
}

или нужно через указатели?
так можно. Но лучше не нужно, prs лишняя переменная.

через указатели можно например так:
struct Person {
char* name;
double money;
};

struct Person* Person_init(char* name, double money) {
struct Person* prs = (struct Person*)malloc(sizeof(struct Person));
prs->name = name;
prs->money = money;
return prs;
}

int main() {
char name[] = "myname";

struct Person* d;

d = Person_init(name, 3.5);

printf("%s %f", d->name, d->money);

free(d);
return 0;
}
Galina Kopylova
Galina Kopylova
3 164
Лучший ответ
выше хороший пример :) .

Еслиб ты создавал обьект размером с 4 байта (для 64-разрядного - 8 байт) - то разумно так. Посмотри ышяуща (название твоей стуктуры) - сколько весит.

У тебя возрашается (если сможет: ) содержимое структуры. Представь что она большая ?! Лишняя вставка на копирование этой кучи данных А если они ешо ссылаются на чтото внутри себя то усе. .

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

Или через ТУЦ тип переменой - вернет указатель. Его и возврашай.

В современых компилерах можно ставить методы. Например конструктор - имяструктуры в скобках параметры, в теле запись ее кишок по ним. Прям в описани структуры. В программе - после ТУЦ пишеш название структуры и параметры. Или при определении в коде надо также вызвать конструктор - скобки после имени переменой с параметрами в них.