设置结构变量 - C.

时间:2013-02-08 23:27:44

标签: c memory struct

我在以下类型的布局中有一些代码,我认为在调用topExamplebotExample / 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;
}

3 个答案:

答案 0 :(得分: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分配内存,但在您的计划结束之前,您需要在任何延迟Example上致电addTopBotExample使用此free(exampleInstanceThatWasPassedIntoAddTopBotExampleAtSomePoint.topExample); free(exampleInstanceThatWasPassedIntoAddTopBotExampleAtSomePoint.botExample); 函数的

{{1}}

答案 1 :(得分:0)

你已经把所有东西放在了一起。在ExamplecreateTopExample

中分配createTopExample
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;
}

答案 2 :(得分:0)

噢,这很糟糕。 addTopBotExample()函数中的表达式“示例顶部”在堆栈上分配了该对象。退出函数后它将被删除。 (与以下行中的“示例机器人”相同。)这样的事情会更好:

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;
}