今天写了一个题目,遇到一个关于堆的问题,翻找资料并没有找到合适的解答,想问一下各位这个需要怎么解决?然后我想知道int类型
的数组的的长度的范围
内存基本分配
可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。
静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。静态存储区的生命周期相当于与程序的生命同时存在.
栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放, 栈的生命周期很短暂.栈资源由编译器自动管理,无需手工控制。 栈是一块连续的内存区域,大小是操作系统预定好的,windows下栈大小是2M(也有是1M,在编译时确定,VC中可设置)。只要栈的剩余空间大于所申请空间,系统为程序提供内存,否则报异常提示栈溢出。 栈有静态分配和动态分配,静态分配由编译器完成(如局部变量分配),动态分配由alloca函数分配,但栈的动态分配的资源由编译器进行释放,无需程序员实现。
堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。堆区的生命周期相当于与程序的生命同时存在(如果您不在程序运行中间将堆内存delete的话).堆中资源由程序员控制。堆是不连续的内存区域(因为系统是用链表来存储空闲内存地址,自然不是连续的),堆大小受限于计算机系统中有效的虚拟内存(32bit系统理论上是4G),所以堆的空间比较灵活,比较大。
题主上面的代码,将 arr[] 和 arr2[] 两个数组的定义,放到int main() 函数之前,定义成全局变量即可。
你前面那一堆,彻底删除看看
不知道你这个问题是否已经解决, 如果还没有解决的话:使用size_t offsetof(struct sName, ch1);//返回类型是size_t, 无符号整型
该问题是因为栈的大小不够导致发生了栈溢出错误,可以考虑以下两种常见解决方法:
方法一:增加栈的大小
增加栈的大小可以通过两种方法来解决:
1.在ide中改变堆栈的大小。在visual studio或eclipse等ide中,可以在某些选项中看到程序的堆栈大小,可以对其进行调整。
2.直接增加栈的大小,代码如下:
int main () { const rlim_t kStackSize = 64L * 1024L * 1024L; // min stack size = 64 Mb struct rlimit rl; int result;
result = getrlimit(RLIMIT_STACK, &rl);
if (result == 0)
{
if (rl.rlim_cur < kStackSize)
{
rl.rlim_cur = kStackSize;
result = setrlimit(RLIMIT_STACK, &rl);
if (result != 0)
{
fprintf(stderr, "setrlimit returned result = %d\n", result);
}
}
}
// ...
}
上述代码通过修改最小栈大小来增加栈的大小,可以尝试调整为自己所需的大小。
方法二:优化代码
在编写代码时,应该尽量避免使用过多的递归调用,以及开辟过大的内存空间等。同时,也可以考虑一些其他优化策略。
另外,C语言中int类型的数组长度范围通常取决于操作系统的位数和所使用的内存大小。在32位操作系统下,其长度通常只能达到2G左右。么