免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7535 | 回复: 3
打印 上一主题 下一主题

求助 用gcc 编译的程序中,定义的数组最大是多少? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-10 17:07 |显示全部楼层 |倒序浏览
各位老大,如果我想定义两个4M的数组,该加什么编译选项呢??在linux中定义的数组最大是多少呢。而不是用malloc。

如我想定义:
Msg[4*1024*1024];
TmpMsg[4*1024*1024];

论坛徽章:
0
2 [报告]
发表于 2006-08-11 12:52 |显示全部楼层
定义的数组主要占的是stack的空间,而在程序连接的时候ld默认开的是2M的stack空间 而在我的程序定义是两个4M的空间。所以在运行的时候就会报SIGSEGV,即无效的内存访问. 在ld 选项中可以提高stack空间。
ld -z空间大小 -o程序名 各个.c生成的.o /usr/lib/crt1.o -L动态连接库目录 -l动态连接库

谢谢各位的提醒。
呵呵,正在试呢。等有了结果再告诉大家。

论坛徽章:
0
3 [报告]
发表于 2006-08-12 21:10 |显示全部楼层

回复 14楼 namtso 的帖子

回答的好,定义这么两个数组的原因不是malloc 不能用了,而是为了防止用malloc申请不到内存而造成程序在运行中退出。

之所以写的这么恶心是想在别人调用我们的接口的时候不会因为malloc不到内存而失败。

论坛徽章:
0
4 [报告]
发表于 2006-08-13 16:46 |显示全部楼层
我们的程序是这样的:频繁地生成从2M-4M大小的数据包,超过的或者小于的都是非法的,丢掉。如果符合条件将此数据包交由中间件传输。我觉得我们的情况和 yeajchao 兄的情况很相似。这中间的平台包括Windows,Linux,Aix.在程序的编译过程中总是出现因为栈空间不够用而出错的。在Windows平台上我们是知道是如何处理这种情况的。在linx和Aix上我们不知道如何处理,所以才有了上面的疑问。

现在终于知道了在Unix平台下如何处理了。我结合从网上找到的资料和namtso 兄的帮助,把我的总结发上来,感谢大家的帮助!!!!


如果数组定义成局部变量非静态变量,那么数组就会在栈上分配,当数组超过默认栈的大小时,会引起非常内存访问。
如果数组定义成全局变量或者局部静态变量,并且不初始化,数组在.bss段中分配,当程序加载时,由操作系统来完成。
如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。
如果数组定义成全局变量或者局部静态变量,并且初始化,数组在.data段中,由链接程序分配空间,当程序加载时,操作系统直接加载映像到内存或者使用内存映射技术。
如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。

不同平台的默认栈的大小如下:
platform                                                        default size       
===============================================================
        SunOS/Solaris                                8172K bytes                (Shared Version)
        Linux                                                         8172K bytes       
        Windows                                                        1024K bytes                (Release Version)
        cygwin                                                        2048K bytes       
       
       
        数组定义成局部变量非静态变量,那么数组就会在栈上分配,当数组超过默认栈的大小时,会引起非常内存访问。那么如何修改系统默认的栈的大小
        呢。
        一般说来,在Unix-like平台,栈的大小不是由程序自己来控制的而是由环境变量来控制的,所以就不能通过设置编译器(像gcc)的任何编译标志来设置栈的大小;
         
在windows平台下,栈的大小的信息是包含在可执行文件中的。它可以在Visual C++的编译过程中设置,但是在gcc中是不可行的。
也可以用Microsoft提供的一个叫作:”editbin.exe“程序来直接修改可执行文件的栈的大小。
       
        下面给出一些更详细的资料:
       
       
        SunOS/Solaris:
==============
        > limit                         # shows the current stack size
        > unlimit                 # changes the stack size to unlimited
        > setenv STACKSIZE 32768 # limits the stack size to 32M bytes
       
        Linux:
======
        > ulimit -a                # shows the current stack size
        > ulimit -s 32768        # sets the stack size to 32M bytes

Windows (在编译过程中的设置):
=============================
        1. Select "Project->Setting".
        2. Select "Link" page.
        3. Select "Category" to "Output".
        4. Type your preferred stack size in "Reserve:" field under "Stack
           allocations". eg, 32768 in decimal or 0x20000 in hexadecimal.

Windows (修改可执行文件):
=======================================
There are two programs included in Microsoft Visual Studio, "dumpbin.exe"
and "editbin.exe".  Run "dumpbin /headers executable_file", and you can see
the "size of stack reserve" information in "optional header values".  Run
"editbin /STACK:size" to change the default stack size.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP