循环中的值结构

时间:2017-04-27 09:09:36

标签: c

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

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

}while (/**something*//)

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

getThefoo

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

NSURL *whatsappURL = [NSURL URLWithString:@"https://api.whatsapp.com/send?phone=9530670491&text=hello"]; if ([[UIApplication sharedApplication] canOpenURL: whatsappURL]) { [[UIApplication sharedApplication] openURL: whatsappURL]; } 在外部库中定义。因此,返回指向食物结构的指针并非易事。

1 个答案:

答案 0 :(得分:1)

这不起作用,你将存储超出范围的本地地址,使存储的地址无效。

正确的解决方法似乎是不在数组中存储指向struct foo的指针,而只是直接存储指针:

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()可能会失败,上述情况会在发生这种情况时丢失旧的分配(如果有的话)。

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