为什么“读取位置时发生访问冲突”?

问题一:
报错信息:

img

1、肯定是发生了越界。建议改成这样:

    for (int i = 0; i < n /* arlength(a1)*/; i++)
    {
        int sign = 0;
        for (int k = 0; k < n/* arlength(a1)*/; k++)
        {
            for (int j = 0; j < alength(a, i) && i != k; j++)
            {

2、arlength这个获取长度方式也有问题,里面必然会导致越界问题。而a1就是通过new int[n]动态创建的,因此a1长度已知的,直接使用n即可。
3、如果是想获取'a1中有效元素的长度,那么arlength(a1)还应该传入a1`数组的长度,for循环条件要加上k小于数组长度,a1之类的也最好初始化为其他整数,方便判断。

这是文字版代码:

#include
using namespace std;

int alength(int** a,int i)
{
int length=0;
for (int k = 0; a[i][k] <= 100 && a[i][k]>=0; k++)
{
length++;
}
return length;
}

int arlength(int* a)
{
int length=0;
for (int k = 0; a[k] >= 0, a[k] <= 100; k++)
{
length++;
}
return length;
}

int main()
{
int n,temp1,temp2,i2=0;
cin >> n;
int** a;
a = new int*[n];
int a1;
a1 = new int[n];
int
a2;
a2 = new int[n];
for (int i = 0; i < n; i++)
{
a[i] = new int[100];
}
for (int i = 0; i < n; i++)
{
cin >> temp1;
//temp1 = a1[i];
int sign = 0;
if (i > 0)
{
for(int k=i-1;k>=0;k--)
{
for (int j = 0; j < sizeof(a[k])/sizeof(int); j++)
{
if (a[k][j] == temp1)
{
sign++;
break;
}
}
if (sign != 0)
break;
}
}
int k = 0;
int temp2 = temp1;
while (temp1 != 1&&sign==0)
{
if (temp1 % 2 == 0)
{
temp1 = temp1 / 2;
a[i2][k] = temp1;
}
else
{
temp1 = (3 * temp1 + 1) / 2;
a[i2][k] = temp1;
}
k++;
}
if (sign == 0)
{
a1[i2] = temp2;
i2++;
}
}
for (int i = 0; i < arlength(a1); i++)
{
int sign = 0;
for (int k = 0; k < arlength(a1);k++ )
{
for (int j = 0; j < alength(a, j), i != k; j++)
{
if (a1[i] == a[k][j])
{
sign++;
break;
}
}
if (sign != 0)
break;
}
if (sign == 0)
{
int i3=0;
a2[i3] = a1[i];
i3++;
}
}
for (int i = 0; i < arlength(a2); i++ )
{
cout << a2[i] << " ";
}
}

数组大小
int a[10];
size_t size=sizeof(a)/sizeof(int);