C 将变量设置为函数的返回类型

C 将变量设置为函数的返回类型,c,function,struct,C,Function,Struct,我似乎不明白为什么这行不通,我正在传递'aHouse'变量一个返回房子的函数。我是C语言的新手,所以我仍在努力了解一些事情 #include <stdio.h> typedef struct house { int id; char *name; } House; House getHouse() { House *myHouse = NULL; char c = getchar(); myHouse->id = 0; my

我似乎不明白为什么这行不通,我正在传递'aHouse'变量一个返回房子的函数。我是C语言的新手,所以我仍在努力了解一些事情

#include <stdio.h>

typedef struct house {
    int id;
    char *name;
} House;

House getHouse()
{
    House *myHouse = NULL;

    char c = getchar();
    myHouse->id = 0;
    myHouse->name = c; /*only single char for house name*/

    return *myHouse
}

int main()
{
    House *aHouse = NULL;

    aHouse = getHouse();
}
#包括
typedef结构房屋{
int-id;
字符*名称;
}房子;
豪斯盖特豪斯酒店
{
House*myHouse=NULL;
char c=getchar();
myHouse->id=0;
myHouse->name=c;/*房屋名称只有一个字符*/
返回*我家
}
int main()
{
House*aHouse=NULL;
a house=getHouse();
}
首先: 您正在使用空指针,并在“getHouse”函数中为其赋值。这是未定义的行为,应给出访问冲突

此外,您正在从getHouse按值返回House对象,并尝试将其指定给指针类型。指针和值是两种不同的东西

这里根本不需要指针,除非您希望在堆上动态分配房屋

House getHouse()
{
    House myHouse;

    char c = getchar();
    myHouse.id = 0;
    myHouse.name = c; /*only single char for house name*/

    return myHouse
}

int main()
{
    House aHouse;

    aHouse = getHouse();
}
编辑:为了提高效率,您可以这样实现:

void getHouse(House* h)
{ 
    char c = getchar();
    h->id = 0;
    h->name = c; /*only single char for house name*/
}

int main()
{
    House aHouse;    
    getHouse(&aHouse);
}
再次编辑: 同样在房屋结构中,因为名称只能是一个字符,所以不要使用字符*作为名称,只使用字符。

首先: 您正在使用空指针,并在“getHouse”函数中为其赋值。这是未定义的行为,应给出访问冲突

此外,您正在从getHouse按值返回House对象,并尝试将其指定给指针类型。指针和值是两种不同的东西

这里根本不需要指针,除非您希望在堆上动态分配房屋

House getHouse()
{
    House myHouse;

    char c = getchar();
    myHouse.id = 0;
    myHouse.name = c; /*only single char for house name*/

    return myHouse
}

int main()
{
    House aHouse;

    aHouse = getHouse();
}
编辑:为了提高效率,您可以这样实现:

void getHouse(House* h)
{ 
    char c = getchar();
    h->id = 0;
    h->name = c; /*only single char for house name*/
}

int main()
{
    House aHouse;    
    getHouse(&aHouse);
}
再次编辑:
同样在House结构中,因为名称只能是一个字符,所以不要使用char*作为名称,只使用char。

这段代码中存在很大的问题:在将myHouse指针初始化为NULL后,您无法使用它。这不是家庭作业,只是对我的一些不起作用的代码的简单抽象@didier啊好的,这开始变得更有意义了,谢谢。这段代码有很大的麻烦:在你将myHouse指针初始化为NULL后,你不能使用它。这不是家庭作业,只是我的一些代码的一个简单的抽象,没有工作@迪迪埃啊好的,这开始变得更有意义了,谢谢。谢谢,这正是我想要的。指针开始变得更有意义了。如果我的主函数指向*a,那么无法保证House在我退出函数后仍然存在,对吗?如果getHouse返回指向House类型的局部变量的指针,那么这也是未定义的行为,因为局部变量将在堆栈上分配,然后在函数退出时从堆栈中解除分配。如果您需要该对象在函数返回时仍然有效,则需要将其分配到堆中(例如,使用malloc()。指针将保持有效,直到它指向的内存被释放(例如,使用free()。如果在堆上进行分配,则需要小心以后释放内存以避免泄漏。我建议你好好读一读。谢谢,这正是我想要的。指针开始变得更有意义了。如果我的主函数指向*a,那么无法保证House在我退出函数后仍然存在,对吗?如果getHouse返回指向House类型的局部变量的指针,那么这也是未定义的行为,因为局部变量将在堆栈上分配,然后在函数退出时从堆栈中解除分配。如果您需要该对象在函数返回时仍然有效,则需要将其分配到堆中(例如,使用malloc()。指针将保持有效,直到它指向的内存被释放(例如,使用free()。如果在堆上进行分配,则需要小心以后释放内存以避免泄漏。我建议好好读一读。