2011-07-05 27 views
4

は、私はこのような文書化インタフェースを持っています。 だから私はC構造体の質問

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

を行う。しかし、それは初期化に失敗し続けています。私はこの権利をしていますか? Somethingメソッドの最初のメンバーは、まったく同じ構造体へのポインタですか?

誰でも説明できますか?

ありがとうございました

+0

この質問にC++はあまりありません。あなたはタグを削除するか、Benのような回答を得ることを検討するかもしれません。 – pmr

+1

私は1つのことを得ることができません:そのtypedefの目的は何ですか? – sidyll

+1

'Tree'を'} 'と'; 'の間に移動して構造体に名前をつけない限り、typedefを削除したいでしょう。^@ sidyll +1あなたのコメントは私がこれを投稿した後に現れました。 – Joe

答えて

8

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); 
} 
+0

関数ポインタは単なるポインタであることに注意してください。どこかの関数を参照する必要があります。 –

+0

:/わかりません... SomeFunctionMatchingSomethingSignatureとは何ですか? – Pett

+0

私はあなたのためのコード例を追加しました。 – Joe

4

これは貧しい人の仮想機能です。初期パラメータは、メンバー関数のC++のthisポインタとほぼ同じです。また、C++の仮想関数はコンパイラによって設定されていますが、関数ポインタを呼び出す前に手動で設定する必要があります。

+1

これは本当に質問に答えません。それはC/C++とマークされていますが、明らかにCの問題です。失敗しているからです。 –

+0

私に例を教えていただけますか?ありがとう! – Pett

+0

貧しい人のための+1仮想機能の洞察 – larsmoa

1

メンバーTree::Somethingが初期化されることはありません。 Treeの領域を割り当てますが、割り当ては初期化とは異なり、割り振られたTreeには意味のないビットしか含まれません。