我目前正在开发一个有100,000个大型数组的c ++程序。我用从1到100,000的顺序值填充了它。我想使它成为质数数组,所以我想遍历并删除2、3、5的倍数。因此,我的逻辑是从4开始,将其删除,将索引加2并删除,然后继续直到数组的末尾。好吧,在我要删除* p = 0行的倍数的循环中,我抛出了异常。当我将数组的大小更改为100或什至1000时,我没有收到此异常,它成功删除了所有的倍数。任何帮助将不胜感激。这是我的程序:
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
// Function prototypes:
void generateBigArray(int *, int);
void deleteMultsOf2(int *, int);
// Fill up the array with values 1 - 100,000.
void generateBigArray(int *p, int size)
{
int count = 1;
for (int i = 0; i < size; i++)
{
*p = count++;
p = p + 1; // bump to the next location.
}
}
void deleteMultsOf2(int *p, int size)
{
p = p + 3; // start at 4 to zero it out
for (int i = 0; i < size; i++)
{
{
*p = 0;
p = p + 2;
}
}
}
int main()
{
// an array to hold prime numbers from 1 - 100,000
const int BIGSIZE = 100000;
int bigAry[BIGSIZE];
// a pointer for the prime number array.
int *bigptr;
bigptr = bigAry;
generateBigArray(bigptr, BIGSIZE);
deleteMultsOf2(bigptr, BIGSIZE);
return 0;
}
答案 0 :(得分:0)
问题是您要迭代func combine(n int, k int) [][]int {
result := [][]int{}
comb := []int{}
subcom(0, k, n, &comb, &result)
return result
}
func subcom(s, k, n int, comb *[]int, result *[][]int) {
if k > 0 {
for i := s + 1; i <= n-k+1; i++ {
c := append(*comb, i)
subcom(i, k-1, n, &c, result)
}
} else {
*result = append(*result, *comb)
}
}
次(例如100000),但是每次都将指针增加size
。因此,如果您从2
开始,到最后一次迭代时,您将到达200003。
也将外观增加2,并使用p + 3
进行初始化,这样可以解决您的问题:
i = 3
关于为什么它可以使用某些大小的原因:它不一定有效,只是避免访问冲突。指针溢出有时很难诊断,因为指针溢出并不总是在问题所在的地方产生错误。
如果碰巧超出了应用程序的内存空间,则会遇到访问冲突,操作系统将终止您的程序。但是,操作系统不在乎您在应用程序内存空间中做什么。因此,取决于该空间的布局方式,您可能会完全耗尽应用程序内存,这可能会给您造成严重破坏,并在不断出现故障时让您挠头,永远不会在同一地方两次。
对于此程序,由于访问的内存更多,因此更有可能在应用程序范围之外运行。您可能会遇到较大的访问冲突。