分段错误取决于我在c ++中声明的顺序

时间:2017-11-30 06:18:36

标签: c++ segmentation-fault

我是c ++的新手。在过去9个月左右的时间里做这件事,并没有通过书本学习。我总是学到任何我想要完成的事情。这可能已经结束了我做一些草率的代码,所以如果你们建议更合适的代码,我很高兴,但主要是解决手头的问题。

我的代码做了什么:它应该创建一个结构,使我可以很容易地找到和使用半维x [-50; 50] y [-50; 50],但仅限于整数。我声明的此任务结构由“sqared radius”(最大值:5000)索引并填充:

  • 索引(以后用于数组“radidx”)
  • 半径相同的位置数
  • 其真实半径(sqrt)
  • 每个坐标的x和y位置

只是让你知道我的代码中发生了什么。

现在问题是这样的:如果我在结构声明之前声明数组“radidx”,我最终得到了我的解决方案。但是如果我在结构之后声明它,我会得到一个分段错误,因为结构中的条目似乎非常错误。

据我所知,有一位朋友证实了这一点。我的代码之上的声明顺序 - 在使用任何这些声明之前很久 - 应该没有区别,所以这必须是因为我自己的一些草率编码。我想对此进行改进,以避免将来代码中出现类似问题,并在此处使用此代码。我们俩都不知道哪里出了什么问题。

#include <cstdlib>
#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <cmath>
#include <ctime>
#include <chrono>
#include <list>
#include <random>

using namespace std;

// int radidx[1030] = {0}; // Here it does work.
struct radii { int idx; int a=0; double r; int x[32]; int y[32]; };
radii radius[5000];
int radidx[1030] = {0}; // Here it doesn't work.

void rad_corr_init() {
    int count [5001];
    for (int i=0;i<5001;i++) count[i]=0;
/// Helper Function
    /// count amount of positions with the same radius
    for (int i=-50;i<51;i++)
    for (int j=-50;j<51;j++)
    count[i*i+j*j]++;
    /// sort collected radii and exclude radii that don't exist so one can run a for-loop of an radius interval
    int ik=0;
    for (int i=1;i<5001;i++)
    if(count[i]) {radidx[ik]=i; ik++;}

    for (int i=-50;i<51;i++) // This is put here for testing
    for (int j=-50;j<51;j++) { // This is put here for testing
        int il = i*i+j*j; // This is put here for testing
        radius[il].a=0; // This is put here for testing
    } // This is put here for testing

/// Create Radius Structure
    for (int i=-50;i<51;i++)
    for (int j=-50;j<51;j++) {
        int il = i*i+j*j;
        int im = radius[il].a;
        if (!radius[il].a) radius[il].r = sqrt(il);
        radius[il].x[im] = i;
        radius[il].y[im] = j;
        radius[il].a++;
    }
    for (int i=0;i<1030;i++) {printf("%d\t%d\n",i,radidx[i]) /* This is put here for testing */ ;radius[radidx[i]].idx = i;}
}

int main() {
    FILE * result = fopen( "result.txt", "w" );
    rad_corr_init();
    for (int i=0;i<1030;i++) {
        int in = radidx[i];
        int io = radius[in].a;
        for (int j=0;j<io;j++) {
            cout << i << '\t' << in << '\t' << radius[in].r << '\t' << j << '\t' << radius[in].x[j] << '\t' << radius[in].y[j] << endl;
            fprintf(result, "%d\t%d\t%d\t%d\t%f\t%d\t%d\n", i, radius[in].idx, in, radius[in].r, j, radius[in].x[j], radius[in].y[j]);
        }
    }
//  system("pause");
    return 0;
}

我使用以下命令进行编译(如果这是问题的一部分):

g++ radius.cpp -std=c++11 -o ~[some name]/Desktop/run.out;time  ~[some name]/Desktop/run.out
g++ -O4 radius.cpp -std=c++11 -o ~[some name]/Desktop/run.out;time  ~[some name]/Desktop/run.out

谢谢你们的帮助。

1 个答案:

答案 0 :(得分:4)

count有5001个条目,radius只有5000个条目。当您访问radius[50*50+50*50](= radius[5000])时,超出数组范围并覆盖radius之后内存中的内容。

解决方案是将声明更改为radii radius[5001]