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

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

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 则可以开机就设置栈空间大小


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




猜你喜欢

转载自blog.csdn.net/We_are_family678/article/details/80036098