程序在大型struct数组值上溢出

时间:2014-02-15 18:34:31

标签: arrays struct segmentation-fault

代码是礼品包装算法的一种实现。输入文件的每一行都是'X Y Z'形式,我不需要考虑Z坐标。该代码适用于较小的N,如100000,但对较大的N值给出了分段错误。有人可以解释一下它的原因吗?

#include <stdio.h>
#include <stdlib.h>
#define N 200000

struct Point{
    double x,y;
};struct Point p[N];

int ori(struct Point p1, struct Point p2, struct Point p3);

int main(){
        FILE *fp,*fp2;
    fp2=fopen("out.txt","w");
    int i=0;
    fp=fopen("sample.txt","r");
    if(fp==NULL){
        printf("File not found!\n");
        exit(0);
    }
    double g;
    for(i=0;i<N;i++)
        fscanf(fp,"%lf %lf %lf",&p[i].x,&p[i].y,&g);

    int l=0;
    for(i=1;i<N;i++){
        if(p[i].x<p[l].x){
            l=i;
        }
    }

    int base=l,q;
    int chullin[N];
    for(i=0;i<N;i++)
        chullin[i]=-1;

    while(true){
        q=(base+1)%N;
        for(i=0;i<N;i++)
            if(ori(p[base],p[i],p[q])==1)
                q=i;
        chullin[base]=q;
        base=q;
        if(base==l)
            break;
     }
     int cnt=0;
     int a[26];
     for(i=0;i<N;i++)
        if(chullin[i]!=-1){
            a[i]=i;
            fprintf(fp2,"%f %f %d\n",p[i].x,p[i].y,i);
            cnt++;
        }


    return 0;
}

int ori(struct Point p1, struct Point p2, struct Point p3){

    int val=p1.x*(p2.y-p3.y)-p1.y*(p2.x-p3.x)+(p2.x*p3.y-p3.x*p2.y);
    if(val==0) 
        return 0;
    if(val>0)
        return 1;
    else return -1;
}

2 个答案:

答案 0 :(得分:0)

问题不在数组p中,而在数组chullin中。尝试使用malloc函数动态分配数组:

int *chullin = (int*)malloc(sizeof(int)*N);
// do whatever you want with chullin
free(chullin);

编辑:我将尝试解释分段错误的原因。在函数内创建非动态数组时,它将在中分配。 的大小有限,因此当您声明一个大型数组时,堆会溢出。使用malloc时,会动态分配数组,这意味着它在堆栈中分配。 堆栈的大小比堆大得多,因此您可以创建更大的数组。全局数组也在堆栈中分配,这就是你不需要动态分配它们的原因......

修改[2]:数组a的大小为26,这意味着当N大于或等于26时,您将访问无效内存位置,导致分段错误。

答案 1 :(得分:0)

你完全溢出了int数组'a'或至少访问了数组中的不存在的值,如果chullin [i]!= -1超过26分......或者如果chullin [i]其中i> 25,那么你就是在堆栈上写下randoms。

 int a[26];
 for(i=0;i<N;i++)
    if(chullin[i]!=-1){
        a[i]=i; //problem here.
        fprintf(fp2,"%f %f %d\n",p[i].x,p[i].y,i);
        cnt++;
    }