为什么动态数组失败的数字越大?

时间:2017-03-15 17:34:34

标签: c arrays dynamic segmentation-fault

所以我正在解决Hackerrank的这个练习代码:

https://www.hackerrank.com/challenges/dynamic-array

简而言之,我应该实现一个简短的实现和操作动态数组的程序。

所以我写了这个程序:

#include <stdio.h>
#include <stdlib.h>
typedef long long int LLT;
int main()
{
    int n = 0, q = 0, temp = 0,newSize = 1;
    LLT x = 0, y = 0, lastAns = 0, inx = 0;
    scanf("%d %d", &n, &q);

    // Allocating a multidimensional array.
    LLT **seqList = (LLT**) malloc(sizeof(LLT*) * n);
    for(int i = 0; i < n; i++){
        seqList[i] = (LLT*) malloc(sizeof(LLT));
        seqList[i][0] = 1; // Setting the size of the array.
    }

    for(int i = 0; i < q; i++){
        scanf("%d %lld %lld", &temp, &x, &y);
        inx = (x ^ lastAns) % n;
        if(temp == 1){
            seqList[inx][0] += 1;
            newSize = seqList[inx][0];
            LLT* buffer = (LLT*) realloc(seqList[inx], newSize * sizeof(LLT));
            if (buffer == NULL){
                free(seqList[inx]);
                return NULL;
            }
            seqList[inx] = buffer;
            seqList[inx][newSize - 1]  = y;

       }
        else{
            lastAns = seqList[inx][(y % (seqList[inx][0])) + 1];
            printf("%d\n", lastAns);
        }
    }
}

这给出了小测试用例的正确答案,例如:

INPUT: 
2 5
1 0 5
1 1 7
1 0 3
2 1 0
2 1 1

OUTPUT:
7
3

但是像这样的大输入:

INPUT:http://paste.ubuntu.com/24182668/

输出:http://paste.ubuntu.com/24182670/

它出错了。分段错误。 所以我调试了它,发现错误发生在第21行:

seqList[inx][0] += 1;

输入后:

2 212195438 191367377

为什么会这样?我做错了什么?

更新1:

您的评论非常有用,我相应地更新了代码。

更新的代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef unsigned long long int LLT;
int main()
{
LLT x = 0, y = 0, lastAns = 0, inx = 0, n = 0, q = 0, temp = 0, newSize = 1;
scanf("%llu %llu", &n, &q);

// Allocating a multidimensional array.
LLT **seqList = (LLT**) malloc(sizeof(LLT*) * n);
if(seqList == NULL){
    free(seqList);
    printf("Couldn't allocate memory.");
    return 432;
}
for(LLT i = 0; i < n; i++){
    seqList[i] = (LLT*) malloc(sizeof(LLT));
    if(seqList[i] == NULL){
        free(seqList[i]);
        printf("Couldn't allocate memory.");
        return 432;
    }
    seqList[i][0] = 1; // Setting the size of the array.
}

for(LLT i = 0; i < q; i++){
    scanf("%llu %llu %llu", &temp, &x, &y);
    inx = (x ^ lastAns) % n;
    if(temp == 1){
        assert(inx >= 0);
        seqList[inx][0] += 1;
        newSize = seqList[inx][0];
        LLT* buffer = (LLT*) realloc(seqList[inx], newSize * sizeof(LLT));
        if (buffer == NULL){
            free(seqList[inx]);
            printf("Couldn't allocate memory.");
            return 432;
        }
        seqList[inx] = buffer;
        seqList[inx][newSize - 1]  = y;

   }
    else{
        lastAns = seqList[inx][(y % (seqList[inx][0])) + 1];
        printf("%llu\n", lastAns);
    }
}
}

它不会再破坏,但对我在第一次发布问题时使用的测试用例仍然给出了错误的答案。

测试用例:

INPUT:http://paste.ubuntu.com/24182668/

预期输出:http://paste.ubuntu.com/24182670/

请指出我正在犯的错误。

TIA。

0 个答案:

没有答案