引发异常:写访问冲突。 p为0x1140000

时间:2019-02-25 04:21:14

标签: c++ pointers

我目前正在开发一个有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;
}

1 个答案:

答案 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

关于为什么它可以使用某些大小的原因:它不一定有效,只是避免访问冲突。指针溢出有时很难诊断,因为指针溢出并不总是在问题所在的地方产生错误。

如果碰巧超出了应用程序的内存空间,则会遇到访问冲突,操作系统将终止您的程序。但是,操作系统不在乎您在应用程序内存空间中做什么。因此,取决于该空间的布局方式,您可能会完全耗尽应用程序内存,这可能会给您造成严重破坏,并在不断出现故障时让您挠头,永远不会在同一地方两次。

对于此程序,由于访问的内存更多,因此更有可能在应用程序范围之外运行。您可能会遇到较大的访问冲突。

相关问题