我正在HackerRank中进行编码练习。在C ++的可变大小数组练习中,我尝试使用C来做到这一点,但我做对了。
我的代码有时通过简单的测试用例0,但有时没有通过。代码完全相同,但是答案不同。
1 5 4
1 2 8 9 3
0 1
21973
1 3
32764
这是我得到的错误答案
21973
我不知道32764
和1 5 4
1 2 8 9 3
0 1
5
1 3
9
的来源。
这是我期望的答案
Debug
有时我得到了错误的答案,有时我得到了正确的答案。怎么会这样 非常感谢!
答案 0 :(得分:0)
从评论继续,如果练习涉及可变长度数组,则应使用C编写,因为C ++标准不提供VLA(并且在将C99添加到V11之后,它们已从C11开始成为可选的)>
代码的主要问题(除了分配输入的完全失败之外)是它调用未定义行为,因为int tmp_arr[tmp]
在{{ 1}}循环。用for
分配的内容不再存在于循环外,因为p_arr[i] = tmp_arr;
不再存在。超出范围后访问值的任何尝试都会调用未定义行为,请参见Undefined, unspecified and implementation-defined behavior
每次处理输入时,都必须 验证 成功,并且输入的值在有效范围内。例如,tmp_arr
和n
都必须为正值。使用q
,您可以(最少)做
scanf
上面的方法验证了收到了2个输入,并且均为正值。
为了保留用 if (scanf("%d%d", &n, &q) != 2 || n <= 0 || q <= 0) {
fputs ("error: invalid format or value.\n", stderr);
return 1;
}
分配的指针,p_arr[i] = tmp_arr;
必须是分配的类型,以处理未知数量的tmp_arr
个元素,或者必须在循环外部声明(并且足够大以处理所有预期值(假设将tmp
视为输入,这似乎不是预期的方法)。您也不能声明tmp
为静态,因为只有一个实例,并将其重复分配给tmp_arr
会使p_arr[i]
的所有元素都指向同一位置。
只需为p_arr[i]
分配,然后对tmp_arr
的分配将在程序的生存期内或直到程序被释放为止,例如
p_arr[i]
(注意:上面使用 int *tmp_arr = calloc (tmp, sizeof *tmp_arr); /* allocate */
if (!tmp_arr) { /* validate every allocation */
perror ("calloc-tmp_arr");
return 1;
}
p_arr[i] = tmp_arr;
将分配的新内存归零。您可以使用calloc
,因为代码已分配给每个元素)
将其全部放入并添加(最小)验证,您可以执行以下操作:
malloc
(注意:未经测试,因为未提供hackerrank输入)
仔细检查一下,如果还有其他问题,请告诉我。