为什么你会想在堆上拥有一个数组?我的教授给出了两个原因:
- 将数组传递给函数,而不是传递副本
- 使数组超出范围
这两个问题是否可以通过以下方式解决:
- 传递指向堆栈上数组的指针
- 返回数组的值而不是数组本身(即使用复制构造函数)
能否给我一个必须使用堆上数组的示例?
sizeof
运算符的操作数;b)你使用 &
运算符获取其地址;c)它是文字字符串初始化器。 当然,这些例外也适用于数组名称。 如果您在函数中将其作为参数接收,则具有指针,而不是数组。 - Filipe Gonçalves#include <assert.h>
#include <stdlib.h>
int * f(int* array) {
assert(array[0] == 1); // OK
int static_array[] = {1, 2, 3};
//return static_array = {1, 2, 3}; //BAD: only lives in this function
int * dynamic_array = malloc(sizeof(int) * 2);
dynamic_array[0] = 1;
dynamic_array[1] = 2;
return dynamic_array; // OK: lives outside also
}
int main()
{
int static_array[] = {1, 2, 3};
int * returned_array;
returned_array = f(static_array);
assert(returned_array[0] == 1);
free(returned_array);
}
new
关键字是从哪里来的?这个问题标记了 [tag:C]。 - Joshua Taylor除非你需要让数组在声明和初始化它的函数的作用域之外继续存在,否则编译器可以进行一些优化,这些优化很可能比程序员猜测的更有效。除非你有时间进行基准测试和实验,并且你的应用程序对性能至关重要,否则将优化留给编译器。
在堆上分配数组而不是栈的原因:
#include <string.h>
int main() {
volatile char buf[1024 * 1024 * 64];
memset(buf, 0, sizeof(buf));
}
std::array
自 C++11 起就已经存在了。难怪我没有想到它。不过请原谅我,我得去把一些孩子从我的草坪上赶走。 - Joshua Taylorstd::array
并不意味着数组现在有构造函数了。该语句只是变得模糊了;)(“原始”数组与std::array
)。 - dyp