分段错误:11通过struct中的函数指针返回stuct

时间:2015-07-22 15:01:47

标签: c pointers struct segmentation-fault

我试图模仿构造函数。我试图通过让父EJB具有一个返回指向子结构的指针的函数指针来做到这一点。任何帮助将不胜感激。

#include <stdio.h>
#include "stdlib.h"

typedef struct child_t {

  char *name;

} Child;

typedef struct parent_t {

  Child (*NewChild)();

} Parent;

Child *NewChild() {
  Child *child = malloc(sizeof(Child));

  child->name = "foo";

  return child;
}

int 
main()
{
  Parent parent;

  Child child = parent.NewChild();
}

3 个答案:

答案 0 :(得分:9)

好像你还没有初始化parent.NewChild。尝试在调用之前将其设置为函数指针,如下所示:parent.NewChild = NewChild;

另外,您是否错过*中的Child *child = parent.NewChild();

附录:根据评论,Parent声明中也存在错误/冲突: 声明其NewChild成员函数返回Child,而免费方法NewChild返回Child*。因此,将成员函数指针声明为Child * (*NewChild)();

答案 1 :(得分:3)

我认为你的意思是以下

#include <stdio.h>
#include <stdlib.h>

typedef struct child_t {

  char *name;

} Child;

typedef struct parent_t {

    Child * ( *NewChild )( void );

} Parent;

Child * NewChild( void ) 
{
    Child *child = malloc( sizeof( Child ) );

    child->name = "foo";

    return child;
}

int main( void )
{
    Parent parent = { NewChild };

    Child *child = parent.NewChild();

    puts( child->name );

    free( child );
}    

程序输出

foo

那就是你应该正确地声明这个功能。它的返回类型必须是指针。因此,您必须在结构定义中正确声明函数指针

typedef struct parent_t {

  Child (*NewChild)();
  ^^^^^^
} Parent;

您需要初始化Parent类型的对象。

Parent parent = { NewChild };

否则它具有不确定的值。

答案 2 :(得分:1)

我在您的代码中看到以下问题。

功能和功能指针不匹配

Parent中,您已将NewChild定义为:

Child (*NewChild)();

这表示NewChild是一个指向函数的指针,该函数不带参数并返回Child个对象。

您定义的功能:

Child *NewChild() { ...

不带参数并返回指向Child的指针,而不是Child的对象。

您必须决定哪一个需要修复。要修复该函数,请使其返回类型为Child

Child NewChild() { ...

未初始化Child parent

您已将parent.Child的值保留为未初始化但尚未尝试使用它。

设置Child

的成员

您可以使用以下代码设置name的{​​{1}}。

child

这可能是也可能不是问题,具体取决于您使用child->name = "foo"; 的方式,因为child->name指向计算机只读内存中的某些全局数据。最好复制child->name

以下是我更新代码的建议:

"foo"