我有一些如下布局的代码,我相信当我调用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
不分配内存,那么在多次调用时就会出现问题重写createTopExample
和createBotExample
以使用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);