C 结构未初始化的外部构造函数

标签 c pointers scope init

我有一个“JobSequence”结构,我希望在我的主函数中实例化它。为此,我创建了一个 new_JobSequence() 函数,该函数分配内存并为结构的所有字段提供正确的值。在这个函数中,根据我的调试器,一切都正确完成。但是,一旦我回到主函数,int cost 就会被设置为任意值,baseInstance = 0x0list = 0x1new_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/

相关文章:

宿主函数返回后事件中可用的 JavaScript 局部范围变量。为什么?

c - 用C语言读取内存块

c - 这个星号是做什么用的?

c - qsort 比较器段错误

c - 空指针数组: valgrind gives invalid write size of 8

ruby - 关于 CoffeeScript 变量范围的困惑

c - 使用 UDRE 和 ATmega328P 的中断驱动 USART

C文件读取留下乱码

c++ - 通过指针调整数组大小

c++ - 关于两个类的范围的错误