我在以下类型的布局中有一些代码,我认为在调用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;
}
答案 0 :(得分:2)
如果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);
函数的:
{{1}}
答案 1 :(得分:0)
你已经把所有东西放在了一起。在Example
或createTopExample
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;
}