2010-08-20 3 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 не является неопределенным указатель, либо объявить его в стеке опуская «*» или передать его с таНосом.

0

изменить основное тело

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

Он будет работать. моральные:

Никогда не игнорируйте предупреждения

.

+0

Вы все еще можете использовать 'g' просто отлично, проблема была просто в том, что это не был указатель. И ваша мораль (как бы снисходительная) не имеет значения, поскольку это была ошибка, а не предупреждение. Трудно игнорировать то, что не даст вам исполняемого кода :-) – paxdiablo

+0

Для первого случая он дает предупреждение – Alam

+0

Правильно, это меня отсортировали тогда. Извиняюсь за это :-) – paxdiablo

Смежные вопросы