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
对此的回答也很明显。
答案 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;
它会起作用。 道德:
永远不要忽略警告