gpt4 book ai didi

c++ - 成功分配的数组太大时访问指针时出错

转载 作者:行者123 更新时间:2023-11-30 04:12:24 25 4
gpt4 key购买 nike

我有以下非常简单的代码,可以完美运行:

void func(int *tab)
{
return;
}

int main()
{
int maxsize = 999*999;
int tabs[maxsize][6];

return 0;
}

但是,当我修改 main 以便获得它时,它崩溃了。

int main()
{
int maxsize = 999*999;
int tabs[maxsize][6];

func(tabs[0]);

return 0;
}

你知道为什么吗?非常感谢您对此的帮助,谢谢 ^^

最佳答案

因此,尽管标准没有讨论堆栈,但大多数现代实现会将自动变量 放在堆栈上,并且堆栈通常在1M 之间。和 8M你会溢出你的数组大小。您可以找到不同系统的典型堆栈大小 here :

SunOS/Solaris   8172K bytes
Linux 8172K bytes
Windows 1024K bytes
cygwin 2048K bytes

第一个没有 seg fault 的原因是因为编译器实际上不需要引用任何内存,但是如果你需要引起一些副作用,那么编译器会生成一个内存访问,这将导致实际的堆栈溢出。既然你说你正在使用 gcc如果我在没有任何副作用的情况下运行此代码( live example ),它确实会调整堆栈指针但永远不会使用它:

subq    $23952048, %rsp

但是如果我们通过 std::cin 添加副作用和 std::cout ( live example ):

std::cin >> tabs[maxsize-1][5] ;
std::cout << tabs[maxsize-1][5] << std::endl ;

然后它将需要使用堆栈指针:

leaq    3(%rsp), %rbx

这通常会在 类 Unix 系统 上产生一个段错误

请注意,您可能还会注意到此警告:

warning: ISO C++ forbids variable length array ‘tabs’ [-Wvla]

那是因为variable length arrays不是标准的 C++(但在 C99 中有效)是 gcc extension当使用 -pedantic 时当您使用扩展程序时,它会发出警告。

关于c++ - 成功分配的数组太大时访问指针时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19846401/

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