我有一个整数数组列表,我想让左右指针数组列表来访问它。但是对于超过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;
}
答案 0 :(得分:1)
正如@PaulR在评论中已经说过,你的问题是堆栈溢出。你可以通过几种方式解决这个问题。如果您坚决反对更改代码,则可以在编译器中调整堆栈大小。具体如何取决于您的编译器(gcc example和VS example)。你也可以在运行时调整它,但这是一个依赖于操作系统的功能,所以我不打算详细介绍。
我更喜欢的解决方案是在堆上分配内存。这可以通过在堆int **left = new int*[n1];
上分配数组来完成,但是当你不再需要内存时,你必须记得调用delete []left;
。更优雅的解决方案是使用std::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];
)或全局地(在任何函数或类声明/定义之外)分配数组