我有一个“JobSequence”结构,我希望在我的主函数中实例化它。为此,我创建了一个 new_JobSequence() 函数,该函数分配内存并为结构的所有字段提供正确的值。在这个函数中,根据我的调试器,一切都正确完成。但是,一旦我回到主函数,int cost
就会被设置为任意值,baseInstance = 0x0
和 list = 0x1
。 new_JobSequence()
前后的jobSequence
地址不变,与函数内部使用的地址相同。
以下是结构体的声明、函数和main的代码:
typedef struct JobSequence{
Instance* baseInstance;
List* sequence;
int cost;
}JobSequence;
void new_JobSequence(Instance* baseInstance, JobSequence* jobSequence){
jobSequence = malloc(sizeof(JobSequence));
jobSequence->baseInstance = baseInstance;
jobSequence->cost = 0;
list_new(&jobSequence->sequence);
}
int main() {
int** P = baseInstance();
Instance instance;
makeInstanceFromBin(P,10,10,4,&instance);
printInstance(&instance);
JobSequence jobSequence;
setbuf(stdout, 0);
printf("address : %p\n",&jobSequence);
new_JobSequence(&instance,&jobSequence);
setbuf(stdout, 0);
printf("address : %p\n",&jobSequence);
Do other stuff (crashes because I try to access the elements of jobSequence which have 0x1 and 0x0 addresses).
}
所以我真的尝试了很多东西,但我真的不知道这里发生了什么......
感谢您的帮助。
最佳答案
当你写的时候
JobSequence jobSequence;
您要求编译器在堆栈上创建一个JobSequence
类型的变量。
因此您不必自己为其保留内存。
您在调试器中遇到的问题是 main
函数中的 jobSequence
未被 new_JobSequence
函数修改。
您可以通过一些调试跟踪看到它:
void new_JobSequence(Instance* baseInstance, JobSequence* jobSequence){
printf("start of %s: js is %p\n", __FUNCTION__, jobSequence);
jobSequence = malloc(sizeof(JobSequence));
printf("after malloc, js is %p\n", jobSequence);
jobSequence->baseInstance = baseInstance;
jobSequence->cost = 0;
list_new(&jobSequence->sequence);
}
<小时/>
因此,要使您的函数对 main
中创建的变量起作用,您必须编写如下内容:
void new_JobSequence(Instance* baseInstance, JobSequence* jobSequence)
{
jobSequence->baseInstance = baseInstance;
jobSequence->cost = 0;
list_new(&(jobSequence->sequence));
}
...
int main(void)
{
/* ... */
JobSequence jobSequence;
new_JobSequence(..., &jobSequence);
}
<小时/>
如果您想在堆上为该结构分配内存,则必须遵循以下方法:
JobSequence *new_JobSequence(Instance* baseInstance){
JobSequence *js= malloc(sizeof *js);
js->baseInstance = baseInstance;
js->cost = 0;
list_new(&(js->sequence));
return js;
}
...
int main(void)
{
/* ... */
JobSequence *jobSequence = new_JobSequence(...);
}
关于C 结构未初始化的外部构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52991332/