分段错误:通过结构中的函数指针返回结构时为 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方法NewChild
return一个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() { ...
未初始化 Child
共 parent
您未初始化 parent.Child
的值,但您正在尝试使用它。
正在设置Child
的成员
您使用以下代码设置 child
的 name
。
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();
}
我正在尝试模拟构造函数。我试图通过让父 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方法NewChild
return一个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() { ...
未初始化 Child
共 parent
您未初始化 parent.Child
的值,但您正在尝试使用它。
正在设置Child
您使用以下代码设置 child
的 name
。
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();
}