所以我正在解决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。