C struct question - PullRequest
       4

C struct question

4 голосов
/ 05 июля 2011

У меня есть документально оформленный интерфейс:

typedef struct Tree {
  int a;
  void* (*Something)(struct Tree* pTree, int size);
};

Тогда, как я понимаю, мне нужно создать его экземпляр и использовать метод Something, чтобы установить значение для «размера». Так что я делаю

struct Tree *iTree = malloc(sizeof(struct Tree));
iTree->Something(iTree, 128);

Но он по-прежнему не может инициализироваться. Я делаю это правильно? Почему первый член метода Something является указателем на ту же самую структуру?

Может кто-нибудь объяснить, пожалуйста?

Спасибо

Ответы [ 3 ]

8 голосов
/ 05 июля 2011

Вы должны установить Something на что-то, поскольку это только указатель на функцию, а не функция.Структура, которую вы создали с помощью malloc, просто содержит мусор, и поля структуры необходимо установить, прежде чем она будет полезна.

struct Tree *iTree = malloc(sizeof(struct Tree));
iTree->a = 10; //<-- Not necessary to work but you should set the values.
iTree->Something = SomeFunctionMatchingSomethingSignature;
iTree->Something(iTree, 128);

Обновление

#include <stdlib.h>
#include <stdio.h>

struct Tree {
    int a;
    //This is a function pointer
    void* (*Something)(struct Tree* pTree, int size);
};

//This is a function that matches Something signature
void * doSomething(struct Tree *pTree, int size)
{
    printf("Doing Something: %d\n", size);
    return NULL;
}

void someMethod()
{
    //Code to create a Tree
    struct Tree *iTree = malloc(sizeof(struct Tree));
    iTree->Something = doSomething;
    iTree->Something(iTree, 128);
    free(iTree);
}
4 голосов
/ 05 июля 2011

Это виртуальная функция бедняка.Начальный параметр примерно эквивалентен указателю C ++ this в функции-члене.И вы должны вручную установить указатели функций перед их вызовом, тогда как виртуальные функции C ++ устанавливаются компилятором.

1 голос
/ 05 июля 2011

Элемент Tree::Something никогда не инициализируется.Вы выделяете место для Tree, но выделение отличается от инициализации, а выделенное Tree содержит только бессмысленные биты.

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