以下代码在2Gb机器上运行时给出了分段错误,但在4GB机器上运行 .
int main() { int c[1000000]; cout << "done\n"; return 0; }
阵列的大小只有4Mb . 可以在c中使用的数组大小是否有限制?
你可能只是在这里得到一个堆栈溢出 . 该数组太大,无法放入程序的堆栈地址空间 .
如果你在堆上分配数组,你应该没问题,假设你的机器有足够的内存 .
int* array = new int[1000000];
但请记住,这将需要你 delete[] 数组 . 更好的解决方案是使用 std::vector<int> 并将其大小调整为1000000个元素 .
delete[]
std::vector<int>
在C或C中,本地对象通常在堆栈上分配 . 你正在堆栈上分配一个大数组,超过堆栈可以处理的数组,所以你得到一个stackoverflow.
不要在堆栈上分配本地,而是使用其他地方 . 这可以通过使对象全局化或在全局堆上分配它来实现 . 全局变量很好,如果你不偶然发生,添加一个静态存储说明符,否则只需使用堆 .
这将在BSS段中分配,这是堆的一部分:
static int c[1000000]; int main() { cout << "done\n"; return 0; }
这将在DATA段中分配,这也是堆的一部分:
int c[1000000] = {}; int main() { cout << "done\n"; return 0; }
这将在堆中的某个未指定位置分配:
int main() { int* c = new int[1000000]; cout << "done\n"; return 0; }
此外,如果您在大多数UNIX和Linux系统中运行,则可以通过以下命令临时增加堆栈大小:
ulimit -s unlimited
但要小心,记忆是一种有限的资源,并且有很大的力量来承担很大的责任:)
在这种情况下,您正在堆栈上分配数组,尝试使用alloc分配相同大小的数组 .
因为您将数组存储在堆栈中 . 您应该将它存储在堆中 . 请参阅this link以了解堆和堆栈的概念 .
5 回答
你可能只是在这里得到一个堆栈溢出 . 该数组太大,无法放入程序的堆栈地址空间 .
如果你在堆上分配数组,你应该没问题,假设你的机器有足够的内存 .
int* array = new int[1000000];
但请记住,这将需要你
delete[]
数组 . 更好的解决方案是使用std::vector<int>
并将其大小调整为1000000个元素 .在C或C中,本地对象通常在堆栈上分配 . 你正在堆栈上分配一个大数组,超过堆栈可以处理的数组,所以你得到一个stackoverflow.
不要在堆栈上分配本地,而是使用其他地方 . 这可以通过使对象全局化或在全局堆上分配它来实现 . 全局变量很好,如果你不偶然发生,添加一个静态存储说明符,否则只需使用堆 .
这将在BSS段中分配,这是堆的一部分:
这将在DATA段中分配,这也是堆的一部分:
这将在堆中的某个未指定位置分配:
此外,如果您在大多数UNIX和Linux系统中运行,则可以通过以下命令临时增加堆栈大小:
但要小心,记忆是一种有限的资源,并且有很大的力量来承担很大的责任:)
在这种情况下,您正在堆栈上分配数组,尝试使用alloc分配相同大小的数组 .
因为您将数组存储在堆栈中 . 您应该将它存储在堆中 . 请参阅this link以了解堆和堆栈的概念 .