分段错误:通过结构中的函数指针返回结构时为 11

Segmentation fault: 11 when returning stuct via function pointer in struct

我正在尝试模拟构造函数。我试图通过让父 Struct 有一个函数指针来做到这一点 returns 一个指向子结构的指针。任何帮助将不胜感激。

#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();
}

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

还有,你是不是漏掉了Child *child = parent.NewChild();中的*

附录:根据评论,Parent的声明中也有一个error/conflict: 它的NewChild成员函数声明为return一个Child,而free方法NewChildreturn一个Child*。所以声明成员函数指针为Child * (*NewChild)();.

我认为你的意思如下

#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

那就是你应该正确声明函数。它的 return 类型必须是一个指针。所以必须在结构定义中正确声明函数指针

typedef struct parent_t {

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

并且需要初始化Parent类型的对象

Parent parent = { NewChild };

否则它有一个不确定的值。

我在您的代码中发现了以下问题。

函数和函数指针不匹配

Parent 中,您已将 NewChild 定义为:

Child (*NewChild)();

也就是说 NewChild 是一个指向不带参数的函数的指针,并且 return 是一个 Child 对象。

您定义的函数:

Child *NewChild() { ...

不接受任何参数,并且 return 是指向 Child 的指针,而不是 Child 的对象。

您必须决定需要修复哪一个。要修复函数,请将其 return 类型设为 Child.

Child NewChild() { ...

未初始化 Childparent

您未初始化 parent.Child 的值,但您正在尝试使用它。

正在设置Child

的成员

您使用以下代码设置 childname

child->name = "foo";

这可能是问题,也可能不是问题,具体取决于您如何使用 child->name,因为 child->name 指向计算机只读存储器中的某些全局数据。最好复制一份"foo".

这是我对更新代码的建议:

Child NewChild() 
{
   Child child;

   // strdup is available on some platforms but it can 
   // be implemented easily.
   child->name = strdup("foo");

   return child;
}

int main()
{
   Parent parent;
   parent.NewChild = NewChild;

   Child child = parent.NewChild();
}