假设我有一个来自另一个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];
}
在外部库中定义。因此,返回指向食物结构的指针并非易事。
答案 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()
可能会失败,上述情况会在发生这种情况时丢失旧的分配(如果有的话)。请注意,结构是值,因此可以完全分配,因此我们就是这样做的。