gpt4 book ai didi

c - 全局变量声明如何解决C中的栈溢出问题?

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

我有一些 C 代码。它的作用很简单,从 io 中获取一些数组,然后对其进行排序。

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

#define ARRAY_MAX 2000000

int main(void) {
int my_array[ARRAY_MAX];
int w[ARRAY_MAX];
int count = 0;

while (count < ARRAY_MAX && 1 == scanf("%d", &my_array[count])) {
count++;
}

merge_sort(my_array, w, count);
return EXIT_SUCCESS;
}

它运行良好,但如果我真的给它一组数字 2000000,它会导致堆栈溢出。是的,它用完了所有堆栈。解决方案之一是使用 malloc() 为这两个变量分配内存空间,将它们移动到堆中,所以完全没有问题。

另一种解决方案是将以下 2 个声明移动到全局范围,使它们成为全局变量。

    int my_array[ARRAY_MAX];
int w[ARRAY_MAX];

我的导师告诉我这个解决方案做同样的工作:将这 2 个变量移动到堆中。

但是我上网查了一些资料。全局变量,没有初始化,它们会驻留在 bss 段,对吧?

网上查了一下,这一段只有几个字节。它如何防止堆栈溢出?

或者,因为这2种类型都是数组,所以都是指针,而全局指针驻留在数据段中,说明数据段的大小也可以动态改变?

最佳答案

bss(由符号开始的 block )部分在目标文件中很小(4 或 8 个字节),但存储的值是在初始化数据之后分配的归零内存的字节数。

它通过分配“不在堆栈上”的存储来避免堆栈溢出。它通常位于数据段中、文本段之后和堆段开始之前 — 但如今,简单的内存图片可能更加复杂。

正式来说,应该对“标准没有说必须有堆栈”和其他各种小细节提出警告,但这不会改变答案的实质。 bss 部分很小,因为它是一个数字 — 但这个数字可能代表大量内存。

关于c - 全局变量声明如何解决C中的栈溢出问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38909811/

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