2010-08-20 166 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