我想声明并初始化堆栈上的大型3D数组。C函数将大型3D数组声明为:
#define NMATS 36
#define ROWS 10000
#define COLS 9
void myfunc(void)
{
double mat[NMATS][ROWS][COLS];
// Initialize later ...
}在VS代码中,命令cl.exe /Zi /EHsc /Fe: C:\Users\usr\project\c\build\main.exe c:\Users\usr\project\c\src\main.c成功地构建了代码。但是,在运行时,我得到了错误:
Unable to open 'chkstk.asm': File not found.这表明我的堆栈储备规模太小了。但是,我对VS代码还比较陌生,我想知道如何增加堆栈的保留大小,并为cl.exe指定选项。
发布于 2022-03-05 16:58:45
正如注释中提到的,执行动态分配,这样您就不必依赖编译器开关和体系结构限制:
#define NMATS 36
#define ROWS 10000
#define COLS 9
typedef double MAT[NMATS][ROWS][COLS];
void myfunc(void)
{
MAT* mat = (MAT*)malloc(sizeof(MAT));
// initialize the matrix by referencing it as `*mat`
(*mat)[0][0][0] = 0;
free(mat);
}但是,如果您坚持需要堆栈分配:
假设sizeof(double)==8,36*10000*9*sizeof(double) == 25,920,000.因此,您至少需要堆栈空间中的许多字节,再加上一些额外的函数调用和局部变量开销。因此,让我们再加上一百万字节,再把二千七百万字节算起来。
如果您真的坚持要有27 MB的堆栈分配可用。我假设您使用的是Microsoft编译器:
设置链接器选项:/STACK:27000000
以上内容适用于所有Visual项目。
如果您的自定义构建步骤只是cl.exe的一次运行(而不是单独的链接器步骤),则可以让编译器通过/F命令参数转发命令行选项:
cl.exe /F27000000 /Zi /EHsc /Fe: C:\Users\usr\project\c\build\main.exe c:\Users\usr\project\c\src\main.chttps://learn.microsoft.com/en-us/cpp/build/reference/f-set-stack-size?view=msvc-170
https://learn.microsoft.com/en-us/cpp/build/reference/stack-stack-allocations?view=msvc-170
https://stackoverflow.com/questions/71363988
复制相似问题