字符数组动态开辟空间和静态开辟空间

动态分配空间和静态分配空间,最直观的理解是编写代码时分配空间大小还是运行时动态分配空间大小。前者空间分配完成后无法更改,后者是在运行时可以根据自身需要来分配空间大小。例如:

char buffer[1000];                   //静态分配

/*
 *动态分配
 */
scanf(“%d”,&MAXSIZE);
char *buffer=(char *)malloc(sizeof(char)*MAXSIZE);

动态分配和静态分配,最大的不同是对于内存空间的不同,动态分配系统分配的内存中堆区域,静态分配分配的是内存中栈区域。对于char来说,如果MAXSIZE的数值不是很大的时候也就是字符串长度不是很大的时候或许体现不出来两者的区别,那么我们将数组空间开辟到非常大,比如说是10M,即10*1024*1024 的大小,那么很多系统在运行的时候对于静态分配就会报Segmentation fault,但是对于动态分配来说就不会出现上面那个错误。

下面我对于上面这个问题进行了一些分析(只针对于Linux下的gcc环境),

对于静态分配,占用的是内存中栈区域,系统对于栈区域大小的限制,就决定了静态分配时报错的空间。

首先我们先来看看系统对于Stack空间的限制大小是多少:

$ulimit -a |grep stack
stack size                     (kbytes, -s) 8192
我们发现对于栈区域的限制大小是8MB,但是我们程序要用的栈空间确实10MB所以必然导致运行时报段错误,那么现在对于这个问题来说,有两种解决方案。第一种,放弃静态分配,改用动态分配,对于较大的区域,推荐使用堆区域,因为如果出现栈溢出很容易导致一些漏洞的出现,导致系统权限被攻击。

第二种,坚持探索解决方案,那么现在要做的就是临时修改栈的大小,采用如下命令:

$ulimit -s 20480                             #20M
$ulimit -s
20480

这样就临时的修改了系统对于栈空间最大值的限制,在编译运行就不会报错了。

对于第二种方法只适合探索这个问题,还是推荐第一种方法,比较安全。

最后补充一下对于linux查看修改线程默认栈空间大小 :ulimit -s
1、通过命令 ulimit -s 查看linux的默认栈空间大小,默认情况下 为10240 即10M
2、通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 102400, 即修改为100M
3、可以在/etc/rc.local 内 加入 ulimit -s 102400 则可以开机就设置栈空间大小


很多时候会发现有些问题在对于数值不是很多的时候,一些问题不会出现,但是当我们把数值变大,很多不知道的错误就会出现了。当我们解决了这些问题以后,会有新的收获。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值