2010-08-20 121 views
1
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 

回答这也将是明显的。

回答

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

0

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

试图解除引用这是一个很大的禁忌

0

struct e *h是一个未定义的指针,或者通过降低“*”声明它在堆栈上或由malloc分配它。

0

您的主体更改为

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

它将工作。 道德:

永远不要忽视警告

+0

你仍然可以使用'g'就好,问题在于它不是一个指针。而你的道德(无论居高临下)是无关紧要的,因为这是一个错误,而不是一个警告。难以忽视的东西,不会给你可执行代码:-) – paxdiablo 2010-08-20 07:22:30

+0

第一种情况下,它会发出警告 – Alam 2010-08-20 07:25:34

+0

对,那是我排序然后。为此道歉:-) – paxdiablo 2010-08-20 07:41:35