我有一些如下布局的代码,我相信当我调用topExample时,botExample/addTopBotExample没有正确设置我认为这是因为顶级bot变量在函数堆栈上,所以在函数结束时被清除我有一种感觉,也许我需要先记忆,但我不确定我将如何做,即使这是正确的方法。

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

最佳答案

如果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之前,这个freemalloc分配的内存,但是在程序结束之前,您需要对使用这个free函数的任何延迟Example调用addTopBotExample
free(exampleInstanceThatWasPassedIntoAddTopBotExampleAtSomePoint.topExample);
free(exampleInstanceThatWasPassedIntoAddTopBotExampleAtSomePoint.botExample);

10-07 18:40