構造体を初期化して戻り値に戻す関数を作成しようとしていますが、動作させることができません。私はどこで間違いを犯したのですか?セグメント化エラーが発生しました。私はミスをしなかった関数の戻り値でC構造体を初期化する
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int id;
char *name;
} Object;
Object object_ctor(int id, char *name);
int main()
{
Object x;
x = object_ctor(1, "Alex");
printf("%s\n", x.name);
return 0;
}
Object object_ctor(int id, char *name)
{
Object y;
y.id = id;
y.name = *name;
return y;
}
Yはスタックにローカルです。関数が終了すると消えます。ヒープを使用する必要があります – OldProgrammer
'object_ctor'の名前を逆参照しています。それをしないでください。 'strdup(name)'やそれに類するものを使用して、ヒープで割り当てられたバージョンの文字列を持つこともできますが、異なる関数から 'object_ctor'を呼び出すと、ポインタはおそらく割り当てられた文字列を指している可能性がありますスタック(すなわち、もはや存在しない)。 – Goodies
@OldProgrammer:構造体などのローカル変数を(コピーして)返すことは完全に許可されています。許容されないのは、ローカル変数へのポインタを返すことです。関数が 'Object *'を返した場合、あなたの心配は正当なものになります。 –