结构指针错误

时间:2010-08-20 07:05:15

标签: c pointers struct

int d() {return 0;} int i() {return 7;}

struct a { int(*b)(); }c={d};

typedef struct e{ struct a f; }g;

main() { struct e *h; h->f.b = i; }

我尝试运行此程序时出现分段错误。有人可以证明这个理由吗?

我也尝试了

int d() {return 0;} int i() {return 7;}

struct a { int(*b)(); }c={d};

typedef struct e{ struct a f; }g;

main() { struct e *h; h = (g)malloc(sizeof(g)); h->f.b = i; }

现在我收到了像

这样的错误
funptrinstrct.c: In function `main': funptrinstrct.c:17: error: conversion to non-scalar type requested

对此的回答也很明显。

4 个答案:

答案 0 :(得分:5)

对于第一个问题,您创建一个指针h而不进行初始化,然后您立即尝试使用h->f.b取消引用它。

对于第二个,你应该转向g*,而不是g

#include <stdio.h>

int d (void) { return 0; }
int i (void) { return 7; }

struct a { int(*b)(void); } c = {d};
typedef struct e { struct a f; } g;

int main (void) {
    struct e *h = (g*)malloc (sizeof (g));
    h->f.b = i;
    printf ("%d\n", h->f.b());
}

那是因为g是一个结构,而不是指向结构的指针。上面的代码按预期输出7

答案 1 :(得分:0)

h是一个未初始化的指针。

试图取消引用它是一个很大的禁忌

答案 2 :(得分:0)

struct e *h是一个未定义的指针,可以通过删除'*'在堆栈上声明它,也可以用malloc分配它。

答案 3 :(得分:0)

将您的主体更改为

struct e *h = (struct e *)malloc(sizeof(struct e)); 
h->f.b = i;

它会起作用。 道德:

  

永远不要忽略警告