gpt4 book ai didi

objective-c - Objective-C 中的可变大小数组?

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:24 25 4
gpt4 key购买 nike

好吧,显然这是可行的:

void foo(size_t s) {
int myArray[s];
// ... use myArray...
}

这真的合法吗?我的意思是,它必须是,因为它编译(C 编译器会拒绝它作为非常量)。我的问题的第一部分是:这是如何工作的?我假设它在堆栈上分配它?这与使用 alloca() 有什么不同吗?

实际上,我找到了一些执行此操作的代码:

void bar(size_t chunkSize) {
CFReadStreamRef foo = NULL;
// ...some stuff to init foo...

while (stuffToDo) {
UInt8 buffer[chunkSize];
// ...read some data from stream into buffer
// using CFReadStreamRead()...
}
}

这行得通。但是,当我将缓冲区分配从循环内部移动到函数的第一行时(就在声明 foo 之前),函数...停止工作。在调试器中,它首先访问局部变量,然后就……退出。我没有看到任何异常被抛出,它没有崩溃,它只是程序继续运行(实际上函数返回一个字符串并且返回值为 NULL,这是返回变量被初始化为)。我不确定发生了什么。我的问题的第二部分是,根据第一部分,到底发生了什么?

最佳答案

它在 C99 中是合法的,尽管很危险,而且是的——它就像 alloca

因为它类似于 alloca,所以在堆栈上进行分配时需要大小合理的数组。如果长度为零,我不确定这是否已定义,但如果数组“足够大”,则肯定会导致堆栈溢出。

至于发生了什么——如果大小合理,将它从循环中拉出来应该没有什么区别。我怀疑您看到未定义的行为是因为参数值太大(或者可能为 0)——您应该验证 chunkSize 参数。程序集会告诉您为什么将其从循环中拉出会有所不同(假设程序中的其他所有内容都是格式正确的)。

关于objective-c - Objective-C 中的可变大小数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11908174/

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