gpt4 book ai didi

c - 最大堆栈大小、ulimit -s、段错误 11——这是如何工作的?

转载 作者:太空狗 更新时间:2023-10-29 16:46:17 24 4
gpt4 key购买 nike

所以,我这样做:

$ ulimit -s
8192

太棒了。据我了解,任何进程的堆栈段都不能超过 8192 KB。

现在,挑战那个..

#include <stdio.h>

void over_8k(void) {
char buf[1024*1024*20];
}

int main(int argc, char** argv) {
printf("Starting .. ");
over_8k();
printf(" finishing.\nHow did this work?\n");
return 0;
}

已编译。跑了。没问题。那么这不对吗?仅 over_8k 就应该有一个超过 20 兆字节的堆栈帧。好吧,让我们尝试访问这 2000 万字节:

#include <stdio.h>
#include <string.h>

void over_8k(void) {
char buf[1024*1024*20];
memset(buf, 'A', sizeof(buf));
}

int main(int argc, char** argv) {
printf("Starting .. ");
over_8k();
printf(" finishing.\nHow did this work?\n");
return 0;
}

..鼓声..

Segmentation fault: 11

太棒了。但这不是我期望的错误?内存访问无效?

为什么它会引发段错误,但不会更早出错?也许是在调用 over_8k 时?这是如何运作的?我想知道一切。

最佳答案

扩展我的评论...

我能想到的有两种可能:

编译器正在优化整个 buf 数组:

在 MSVC 中,启用优化后,整个数组将被完全优化,根本不会分配。所以它没有使用任何堆栈。

堆栈分配只是堆栈指针的递增/递减:

sub rsp, 20971520

不会出现段错误。这只是一个指针。只有当您尝试将其访问到未映射的内存时,它才会出现段错误。

关于c - 最大堆栈大小、ulimit -s、段错误 11——这是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9530555/

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