首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分割故障: 11具大数组

分割故障: 11具大数组
EN

Stack Overflow用户
提问于 2015-12-23 06:29:38
回答 2查看 1.2K关注 0票数 3

一个简单的程序编译得很好,但是给出了运行时错误:segmentation fault: 11

代码语言:javascript
复制
int length=10000;
int num=100;
int num1=20;
int datablocklen=400002; //datablocklen=2*num1*length+2

int main(){
  double arr[num*length];
  double res[num][num];
  for(int i=0;i<num;i++){
    for(int j=0;j<num;j++){
      res[i][j]=0;
    }
  }
  for(int i=0;i<(num*length);i++){
    arr[i]=i;
  }
  int ntile=(int)(num/num1);
  double array_task[datablocklen];
  for(int i=0;i<ntile;i++){
    for(int j=0;j<ntile;j++){
    array_task[datablocklen-2]=i*num1*length;
    array_task[datablocklen-1]=j*num1*length;
      for(int k=0;k<(num1*length);k++){
        array_task[k]=arr[i*num1*length+k];
        array_task[num1*length+k]=arr[j*num1*length];
      }
    }
  }
return 0;
}

gcc -o test -std=c99 test.c来获取可执行文件。

奇怪的是,如果长度被分配给一个小值,比如说1000,错误就不会出现。但当分割值大于10000时,就会出现分割错误。

请注意,,我总是关注数据库锁的值,以确保datablocklen=2*num1*length+2。因此,如果lengthnum1发生变化,我也将更改变量datablocklen

我在mac操作系统yosemite下处理gdb仍然有一些问题。所以我还没有用gdb调试这个程序。但是如果我注释内部for循环,用k索引的循环,则程序执行得很好。我是说,没有错误信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-23 06:36:58

我认为这里的问题是堆叠内存。

有两种解决办法:

  1. 要么增加进程的堆栈大小。通常,ulimit -s将显示linux中任何进程的默认大小,mac。
  2. 在堆栈double arr[num*length];中使用malloc来分配堆中的内存,而不是这样的大数组分配。
票数 3
EN

Stack Overflow用户

发布于 2015-12-23 07:18:13

你可能把堆栈弄满了。它的缺省值通常在8MB左右。由于分配大小是固定的,所以可以将大数组移动到全局空间,并将许多固定值切换到定义中。下面是一个例子,请原谅这种无端的清理方式

代码语言:javascript
复制
#define LENGTH          10000
#define NUM             100
#define NUM1            20
#define NTILE           (NUM / NUM1)

#if 0
#define DATABLOCKLEN    400002              // DATABLOCKLEN=2*NUM1*LENGTH+2
#else
#define DATABLOCKLEN    (2 * NUM1 * LENGTH + 2)
#endif

double arr[NUM * LENGTH];
double res[NUM][NUM];
double array_task[DATABLOCKLEN];

int
main()
{

    for (int i = 0; i < NUM; i++) {
        for (int j = 0; j < NUM; j++) {
            res[i][j] = 0;
        }
    }

    for (int i = 0; i < (NUM * LENGTH); i++) {
        arr[i] = i;
    }

    for (int i = 0; i < NTILE; i++) {
        for (int j = 0; j < NTILE; j++) {
            array_task[DATABLOCKLEN - 2] = i * NUM1 * LENGTH;
            array_task[DATABLOCKLEN - 1] = j * NUM1 * LENGTH;
            for (int k = 0; k < (NUM1 * LENGTH); k++) {
                array_task[k] = arr[i * NUM1 * LENGTH + k];
                array_task[NUM1 * LENGTH + k] = arr[j * NUM1 * LENGTH];
            }
        }
    }

    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34429877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档