0

我正在尝试将函数分配给变量字段,但出现分段错误。这是代码:

typedef struct node{
    int info;
    struct node *link;
    void* (*make) (int x);
}node;

void* make_node(int x)
{
    node* new_node = (node*)malloc(sizeof(node));
    new_node->info = x;
    new_node->link = NULL;
    return new_node;
}

int main(){
  struct node *n;
  n->make = make_node;
  return 0;
}

有什么问题?

4

5 回答 5

2

您进入 main() 的 n 变量未初始化。make_node() 函数将为节点结构保留空间,那么为什么不在 main() 中调用它呢?你可以试试下面的代码。

typedef struct {
    int info;
    struct node *link;
    void* (*make) (int x);
} node;

void *make_node(int x)
{
    node* new_node = malloc(sizeof(node));
    new_node->info = x;
    new_node->link = NULL;
    return new_node;
}

int main() {
  struct node *n;
  n = make_node(1);

  free (n);
  return 0;
}

ps 避免强制转换 malloc 返回

当您在节点内使用 struct node *link 时,ps2 请注意同样的问题

ps3 记得释放()未使用的 malloc()ed 变量。

于 2012-04-07T17:30:42.880 回答
2

您需要为堆上的节点分配一些空间,或者只使用结构的普通变量而不是指针。

于 2012-04-07T16:36:41.053 回答
0

您忘记为 n 赋值。

  1. 将 make_node 的返回类型更改为 node*
  2. 做 n=make_node(x)

我强烈建议您阅读http://www.amazon.com/gp/aw/d/0131103628/ref=redir_mdp_mobile 这将是您现在可以做的最好的事情。

于 2012-04-07T16:32:15.337 回答
0

n您可以通过以下方式在堆栈上分配空间:

int main() {
  struct node n;
  n.make = make_node;
  return 0;
}

否则,您必须将其分配在堆上,可能作为全局变量或使用malloc().

于 2012-04-07T17:10:13.527 回答
0

使用现有的基础架构,您可以编写:

typedef struct node
{
    int            info;
    struct node   *link;
    void        *(*make)(int x);
} node;

void *make_node(int x)
{
    node* new_node = (node*)malloc(sizeof(node));
    new_node->info = x;
    new_node->link = NULL;
    new_node->make = make_node;
    return new_node;
}

int main(void)
{
    struct node *n = make_node(1);
    ...use the newly allocated node...
    return 0;
}

这会在您尝试写入之前分配节点。它还通过将每个字段设置为已知值来完全初始化节点。如果您需要make成员的不同函数指针,您可以在之后进行调整。

于 2012-04-07T18:58:33.430 回答