gpt4 book ai didi

c - 循环中按值构造

转载 作者:行者123 更新时间:2023-11-30 19:09:09 25 4
gpt4 key购买 nike

假设我有一个来自另一个 api 的函数,它按值返回结构

struct foo{
int bar;
bool success;
}

foo getThefoo();

如果调用此函数,循环中会发生什么

int foolen = 0;
foo** foos;
do {
foolen++;
foos = realloc(foos,sizeof(foo*)*foolen);
foo myfoo = getThefoo();
foos[foolen-1]=&myfoo;

}while (/**something*//)

每次迭代都会在堆栈上分配一个新的 foo 结构吗?或者初始分配是否被重用?我问这个问题是因为获取指向该结构的指针可能是一个意外的值。

getThefoo 在外部库中定义。因此,使其返回指向食物结构的指针并不简单。

最佳答案

这不起作用,您存储的本地地址将超出范围,导致存储的地址无用。

正确的修复似乎是不存储指向 struct foo 的指针s 在数组中,但只是直接存储它们:

struct foo *foos = NULL;
size_t foolen = 0;

do {
++foolen;
foos = realloc(foos, foolen * sizeof *foos);
foos[foolen - 1] = getTheFoo();
} while(something something);

当然,通常的注意事项也适用:

  • 调用realloc()更高效不太常见的是,通过过度分配和单独跟踪数组长度和数组分配的空间。
  • realloc()可能会失败,当发生这种情况时,上面的内容会丢失旧的分配(如果有)。

请注意,结构是值,因此是完全可赋值的,所以这就是我们所做的。

关于c - 循环中按值构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43653406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com