-4

我有一个整数数组列表,我想制作左右指针数组列表来访问它。但是对于超过 690.000 个元素(例如 700.000),程序会停止并显示“分段错误(核心转储)。我以前使用过 std::vector 但由于速度原因我必须使用简单的数组列表。这段代码与我的程序无关,它是一种非常简单的方式来告诉我的代码问题。而且我必须使用全局变量,因为此代码在类方法中运行。

int k=698900;


int n1=k/2;
int n2=k/2;
int *left[n1];
int *right[n2]; 
int list[k];

for(int i=0; i<k; i++){
    list[i] = i;
}

for(int i=0; i<n1; i++){
    left[i] = &list[i];
}

for(int i=0; i<n2; i++){
    right[i] = &list[i];
}

for(int i=0; i<n2; i++){
    cout << *right[i] << endl;
}
4

1 回答 1

1

正如@PaulR 在评论中已经说过的那样,您的问题是堆栈溢出。您可以通过几种方式解决此问题。如果您坚决反对更改代码,则可以在编译器中调整堆栈大小。具体如何完成取决于您的编译器(gcc 示例VS 示例)。您也可以在运行时对其进行调整,但这是依赖于操作系统的功能,因此我不打算对此进行详细介绍。

我更喜欢的解决方案是在堆上分配内存。这可以通过在堆上分配数组来完成,但是当你不再需要内存时你int **left = new int*[n1];必须记住调用。delete []left;更优雅的解决方案是使用 astd::vector代替。

我挑战你在所有优化的情况下编译它,并告诉我它比你的代码慢得多。

int k=698900;


int n1=k/2;
int n2=k/2;
//not that I condone storing raw pointers in a vector
//admittedly this is a rather dangerous thing to do
//storing indices would be smarter because upon adding
//elements the memory could be relocated
std::vector<int *> left(n1);  
std::vector<int *> right(n2); 
std::vector<int> list(k);

for(int i=0; i<k; i++){
    list[i] = i;
}

for(int i=0; i<n1; i++){
    left[i] = &list[i];
}

for(int i=0; i<n2; i++){
    right[i] = &list[i];
}

for(int i=0; i<n2; i++){
    cout << *right[i] << endl;
}

就像@PaulR 提到的那样,您还可以静态(static int *left[n1];)或全局分配数组(在任何函数或类声明/定义之外)

于 2013-10-19T16:15:21.923 回答