首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

一个段异常的有关问题,高手指教

2012-05-05 
一个段错误的问题,高手指教#includestdio.h#includestdlib.h#define N 1000000void init_array(int a[

一个段错误的问题,高手指教
#include<stdio.h>
#include<stdlib.h>
#define N 1000000
void init_array(int a[],int n)
{
int i=0;
for(i=0;i<n;i++)
{
a[i]=random()%n;
}
}


int recursive(int a[],int length,int value)
{
if(length==0)
return -1;
if(value==a[length-1])
return length-1;
else
return recursive(a,length-1,value);
}

void linear_test(void)
{
int a[N];
init_array(a,N);
int i,value,index;
int times=100;
for(i=0;i<times;i++)
{
value=random()%N;
index=recursive(a,N,value);
if(index==-1)
printf("not found\n");
else
printf("a[%d]==%d,value==%d\n",index,a[index],value);
}
}

int main(int ac,char*av[])
{
linear_test();
return 0;
}


为什么N换成100000可以正常运行,换成1000000之后就出现段错误,高手详细指点下

[解决办法]
这是因为楼主在函数内的栈溢出了,一般默认堆栈大小是1MB。可以解决的办法有:

1 将数组申请改为new的方式,int a[N]改成int *a = new int[N];但是需要在函数末尾加上delete[] a;
2 另一种办法是修改连接器设置,例如vs2010,见http://msdn.microsoft.com/en-us/library/8cxs58a6.aspx

具体C++中各种变量在内存中的分布,请看这里
http://blog.csdn.net/morewindows/article/details/6851681
[解决办法]
用 vc2008 编译楼主的程序,刚才用 Sysinternal 的 VMMap 看了下,堆栈实际使用了 8.3MB 多,远大于默认的 1MB 了。所以 Win32 环境下的话,N=1000000 时额外的链接选项堆栈设置至少要比 8.3M 大。
[解决办法]
linux 下的没接触过。不过,你所说的段错误提示是在编译阶段的,还是运行时的?如果是编译阶段的,应该是程序模式不对,即创建的是 16 位的程序,这类程序有段最大为 64K 的限制,所以在编译时会有段方面的错误;如果是这个问题,就需要将程序创建为 32 位模式的,并有下面的堆栈问题。如果是运行阶段出现的错误提示,那就是堆栈太小的缘故了,但不应该说是段错误,而应该提示是堆栈溢出,或是简单的程序访问异常而出错;如果是这个问题,就需要在链接时手工设置堆栈段至大于 8.3M 或者是更改工程的链接选项,具体如何操作看你的 c 环境了。
[解决办法]

探讨
我用的是linux下的c

热点排行