Структурные ошибки указателя - PullRequest
1 голос
/ 20 августа 2010
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

Ответ на этот вопрос также будет заметен.1010 *

Ответы [ 4 ]

5 голосов
/ 20 августа 2010

Для первого вопроса вы создаете указатель 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 голосов
/ 20 августа 2010

измените ваше основное тело на

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

Это будет работать.Мораль:

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

.

0 голосов
/ 20 августа 2010

struct e *h - неопределенный указатель, либо объявите его в стеке, удалив '*', либо выделите его с помощью malloc.

0 голосов
/ 20 августа 2010

h - неинициализированный указатель.

Попытка разыменования это большая нет-нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...