2

次のようなレイアウトのコードがあります。を呼び出すと、topExample/botExampleが正しく設定されていないと思いますaddTopBotExample。これは、上位のボット変数が関数スタックにあり、関数が終了するとクリアされるためだと思いますか?おそらく最初に記憶する必要があると感じていますmallocが、それが正しいアプローチであっても、これをどのように行うかはわかりません。

typedef struct Example Example;
struct Example {
   /* normal variables ...*/
   Example *topExample;
   Example *botExample;
};

....

void addTopBotExample(Example **example, int someVariable) {
    Example top = createTopExample(int someVariable); //(createTopExample returns a
                                                      //type Example based on some input)
    Example bot = createBotExample(int someVariable);
    (*example)->topExample = ⊤
    (*example)->botExample = ⊥
    return;
}
4

3 に答える 3

2

がメモリを割り当てていない場合createTopExample、複数回呼び出された瞬間に問題が発生します。を書き直しcreateTopExamplecreateBotExample使用mallocし、を返しますExample*。このようなもの:

Example* createTopExample(stuff)
{
    Example *example = malloc(sizeof(Example)); 
    // ... stuff you do
    return example;
}

次に、次のaddTopBotExampleようになります。

 void addTopBotExample(Example **example, int someVariable) {
     if ((*example)->topExample)
         free((*example)->topExample)
     if ((*example)->botExample)
         free((*example)->botExample)
     (*example)->topExample = createTopExample(int someVariable);
     (*example)->botExample = createBotExample(int someVariable);
     return;
 }

これaddTopBotExampleによりfree、再度呼び出す前に割り当てられたメモリが割り当てられますmallocが、プログラムが終了する前に、この関数を使用しfreeた残りのメモリを呼び出す必要があることに注意してください。ExampleaddTopBotExample

free(exampleInstanceThatWasPassedIntoAddTopBotExampleAtSomePoint.topExample);
free(exampleInstanceThatWasPassedIntoAddTopBotExampleAtSomePoint.botExample);
于 2013-02-08T23:38:07.090 に答える
0

あなたはすでにすべてを一緒に持っています。またはExampleに割り当てますcreateTopExamplecreateTopExample

Example *createTopExample(int someVariable)
{
    Example *x = malloc(sizeof(Example));
    /* initialize x */
    return x;
}

とでaddTopBotExample

void addTopBotExample(Example *example, int someVariable) {
    Example *top = createTopExample(int someVariable); //(createTopExample returns a
                                                       //type Example based on some input)
    Example *bot = createBotExample(int someVariable);
    example->topExample = top;
    example->botExample = bot;
    return;
}
于 2013-02-08T23:37:07.887 に答える
0

Ooooo、これは悪いです。addTopBotExample()関数の式「Exampletop」は、そのオブジェクトをスタックに割り当てました。関数を終了すると、ゴミ箱に移動します。(次の行の「サンプルボット」についても同じです。)このようなものの方がうまく機能します。

void addTopBotExample(Example **example, int someVariable) {
  Example *top = createTopExample(someVariable); // NOTE THE *
  Example *bot = createBotExample(someVariable); // NOTE THE *

  (*example)->topExample = top; // NOT &top !!
  (*example)->botExample = bot; // NOT &bot !!
  return;
}

そして、createTopExampleとcreateBotExampleを記述して、ポインターを返すようにします。

#include <stdlib.h> // For malloc!
Example *createTopExample(stuff)  // Note *. It's returning a pointer.
{
  Example *example = malloc(sizeof(Example)); // Allocate on the HEAP. Lives after this function call.

  // Fill in the fields of example.
  example->field1 = 25; // Note the "->": you're dereferencing a pointer.
  example->title = "Example title";

  return example;
}
于 2013-02-08T23:40:38.803 に答える