首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆栈8MiB,那么为什么这个代码“几乎”工作呢?

堆栈8MiB,那么为什么这个代码“几乎”工作呢?
EN

Stack Overflow用户
提问于 2019-08-22 17:55:27
回答 1查看 126关注 0票数 1

我到处看。

堆栈8MB,这就是为什么您应该使用指针在中存储内容。

在我的机器上,下面的代码使用11兆字节的字符,而不是12 my。

我的char c[Nc] 数组存储在所谓的中。

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int Nc = 1024*1024;  // megabyte

    Nc = Nc * 11;  // works
    //Nc = Nc * 12;  // Segmentation fault (core dumped)

    char c[Nc];

    c[0] = 'A';
    c[Nc-1] = 'Z';

    printf("%dmb\n", Nc/1024/1024);

    printf("%c-%c\n", c[0], c[Nc-1]);

    return 0;
}

有什么解释吗?

我只是“用户”,而不是程序员。

EN

回答 1

Stack Overflow用户

发布于 2019-08-22 20:03:11

看起来您正在编译您的程序,至少有一些优化。当我在GCC或Clang上编译您的代码时,除了-O0之外,编译器将优化char数组的创建。(螺栓连接)

如果您用-fsanitize=undefined编译您的程序,它会将其捕获为未定义的行为。

在堆栈上放置这么大的数组通常被认为是不好的做法。应该静态地在堆上分配或分配大型对象。操作系统将其默认堆栈分配设置为大多数程序无需担心的级别,这不是保证。作为程序员,你有责任确保你的程序有足够的堆栈空间来运行。如果需要获取或检查堆栈空间的大小,可以使用getrlimit()setrlimit()。有关详细信息,请参阅man getrlimit

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57614757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档