相关疑难解决方法(0)

堆栈和堆的内容和位置是什么?

编程语言书籍解释了在堆栈上创建了值类型,并且在堆上创建了引用类型,而没有解释这两者是什么.我还没有看清楚这个问题.我理解堆栈是什么.但,

  • 它们在哪里和它们(物理上在真实计算机的记忆中)?
  • 它们在多大程度上受操作系统或语言运行时控制?
  • 它们的范围是什么?
  • 是什么决定了它们的大小?
  • 是什么让一个更快?

language-agnostic heap stack memory-management dynamic-memory-allocation

7847
推荐指数
27
解决办法
145万
查看次数

"ulimit -s unlimited"有什么作用?

有关堆栈分配的许多相关问题是可以理解的

堆栈和堆的内容和位置是什么?

为什么堆栈大小有限制?

堆栈和堆内存的大小

但是在各种*nix机器上,我可以发出bash命令

ulimit -s unlimited
Run Code Online (Sandbox Code Playgroud)

或者csh命令

set stacksize unlimited
Run Code Online (Sandbox Code Playgroud)

这如何改变程序的执行方式?是否对程序或系统性能有任何影响(例如,为什么这不是默认值)?

如果更多的系统细节是相关的,我主要关注在x86_64硬件上运行的Linux上使用GCC编译的程序.

linux stack ulimit

44
推荐指数
2
解决办法
10万
查看次数

堆栈内存是否有限制?

我正在经历其中一个主题.程序崩溃是因为它在函数内部声明了一个10 ^ 6的数组.

给出的原因是堆栈上的内存分配失败导致崩溃.

当全局声明相同的数组时,它运行良好.(堆上的内存保存了它).

现在,让我们假设,堆栈向下增长并向上堆积.

我们有:

- -堆 - -

-------------------

- -堆 - -

现在,我相信如果堆栈上的分配失败,它也必须在堆上失败.

所以我的问题是:堆栈大小有限制吗?(超过限制导致程序崩溃).或者我错过了什么?

c heap stack operating-system memory-management

9
推荐指数
3
解决办法
7698
查看次数

为什么stackoverflow错误混乱?

这个简单的C程序很少在相同的调用深度终止:

#include <stdio.h>
#include <stdlib.h>

void recursive(unsigned int rec);

int main(void)
{
  recursive(1);
  return 0;
}

void recursive(unsigned int rec) {
    printf("%u\n", rec);
    recursive(rec + 1);
}
Run Code Online (Sandbox Code Playgroud)

这种混乱行为背后的原因是什么?

我正在使用fedora(16GiB ram,堆栈大小为8192),并使用cc编译而没有任何选项.

编辑

  • 我知道这个程序会抛出一个stackoverflow
  • 我知道启用一些编译器优化会改变行为,程序将达到整数溢出.
  • 我知道这是未定义的行为,这个问题的目的是理解/获得可能解释我们在那里观察到的实现特定内部行为的概述.

问题是更多,因为在Linux上,线程堆栈大小是固定的,并且给出了ulimit -s什么会影响可用的堆栈大小,以便堆栈溢出并不总是出现在相同的调用深度?

编辑2 @BlueMoon总是在他的CentOS上看到相同的输出,而在我的Fedora上,堆栈为8M,我看到不同的输出(最后打印的整数261892或261845,或261826,或......)

c stack-overflow recursion operating-system

6
推荐指数
1
解决办法
268
查看次数

c编程中stackoverflow的意义

在下面的代号中

#?include ?<stdio.h>

int main()
{
  printf("Stack Overflow");
  main();
}
Run Code Online (Sandbox Code Playgroud)

运行后,该程序编译器将打印"堆栈溢出"到栈overflow.Here我知道堆栈溢出意味着,这意味着它会打印,直到内存full.Here我的问题是它的内存是什么呢?堆栈的大小是多少?

c stack-overflow

1
推荐指数
1
解决办法
8119
查看次数

编码大于 15000 * 15000 像素的 PNG 文件时,LodePNG 崩溃

我一直在使用 LodePNGlodepng_encode24_file对一些 24 位 RGB 图像文件进行编码,到目前为止它工作得非常好。但是,我注意到当我向它提供大于 15360*15360 像素大小的数据集时它似乎崩溃了(14336*14336 像素图像编码良好)。

对于 32 位情况(崩溃前的最大大小略低),可以通过简单地替换该行来获得此行为的最小示例

  unsigned width = 512, height = 512;
Run Code Online (Sandbox Code Playgroud)

  unsigned width = 1024*14, height = 1024*14;
Run Code Online (Sandbox Code Playgroud)

LodePNG 的 example_encode.c 文件中,并执行它。

我之前遇到过 C 代码崩溃的问题,因为我将大数组分配到堆栈内存(其最大大小通常在 2MB 左右)而不是堆内存,所以作为 C 的新用户,我的第一直觉是看看是否有堆内存大小的上限。

但是,根据这个答案,堆内存没有限制,所以一定是其他地方出了问题。

我的第二个猜测是崩溃是由于 PNG 格式本身支持的最大图像尺寸的固有限制。但是,根据此答案及其下方的评论,PNG 支持的最大文件大小约为 4,000,000,000 * 4,000,000,000 像素,因此这也不是罪魁祸首。

有没有人猜测可能会出什么问题?其他人在尝试时是否能够重现此错误?

编辑:就 RAM 消耗而言,我有 8GB RAM,减去硬件保留的、使用中的、修改过的和备用内存(Windows 资源监视器实用程序使用的术语),在进行计算时,我有大约 4GB 的可用 RAM。对于 15000*15000 大小的 32 位图像,需要小于 1GB。同样,当我成功编码 14000*14000 24 位图像时,我的可用 RAM 在编码过程的任何时候都不会低于 3GB,所以我认为 RAM 耗尽不是问题。

c png

1
推荐指数
1
解决办法
1397
查看次数

C 语言是否指定了堆栈?

C 语言定义是否需要堆栈的存在?不支持堆栈的架构呢?这是否意味着这样的架构不能像定义的那样实现 C 语言?

堆呢?

c stack

1
推荐指数
1
解决办法
353
查看次数