这里有两个代码,一个使用二维数组,另一个使用指针
捕获 带指针的代码运行正常,另一个带有2d数组的代码在某些测试用例中提供了分段错误(并非所有)。它通过了所有测试用例n<=1000
。
n的限制是1< n <10000
。
两个代码的逻辑都是正确的。
问题:
https://www.hackerrank.com/challenges/dynamic-array/problem
我需要知道为什么使用2d数组会给出分段错误。使用2d数组并使用指针代码是不好的。但两者都是一样的。
这是给出细分错误的代码
int main()
{
/* Enter your code here. Read input from STDIn. Print output to STDOUT */
int n, q, o, x, y, ti, pi, la, j;
scanf("%d%d",&n,&q);
int v[n][n],a[n];
for (j = 0; j<n; j++)
a[j] = 0;
la=0;
while(q-->0)
{
scanf("%d%d%d",&o,&x,&y);
ti=((x^la)%n);
switch(o)
{
case 1:
v[ti][a[ti]]=y;
a[ti]++;
break;
case 2:
pi = y % a[ti];
printf("%d\n", v[ti][pi]);
la = v[ti][pi];
break;
}
}
return 0;
}
此代码正常运行
int main()
{
int n, q, o, x, y, ti, pi, la;
int *a, *s;
int **v;
scanf("%d %d", &n, &q);
v = (int **)malloc(n * sizeof(int *));
a = (int *)malloc(n * sizeof(int));
s = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++)
{
s[i] = 1;
v[i] = (int *)malloc(s[i] * sizeof(int));
a[i] = 0;
}
la = 0;
for (int i = 0; i < q; i++)
{
scanf("%d %d %d", &o, &x, &y);
ti = (x ^ la) % n;
if (o == 1)
{
v[ti][a[ti]] = y;
a[ti] ++;
if (a[ti] == s[ti])
{
s[ti] *= 2;
v[ti] = realloc(v[ti], s[ti] * sizeof(int));
}
}
else
{
pi = y % a[ti];
printf("%d\n", v[ti][pi]);
la = v[ti][pi];
}
}
free(s);
free(a);
free(v);
return 0;
}
测试案例如下:
n = 99999 q = 99977
1 624371833 212297989
1 93347849 234235833
1 683498501 669278504
1 364574347 423183716
继续..
view full testcase here
http://www.writeurl.com/text/z2qlksiktbd7aeuvy3zj/dvgaqxcmeugthbkutrtn