动态阵列分割故障

时间:2017-09-26 00:47:06

标签: c arrays pointers

这里有两个代码,一个使用二维数组,另一个使用指针 捕获 带指针的代码运行正常,另一个带有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

0 个答案:

没有答案