C语言中可变大小的数组和数组指针

时间:2019-04-18 06:49:30

标签: c

我正在HackerRank中进行编码练习。在C ++的可变大小数组练习中,我尝试使用C来做到这一点,但我做对了。

我的代码有时通过简单的测试用例0,但有时没有通过。代码完全相同,但是答案不同。

1 5 4 

1 2 8 9 3 

0 1

21973

1 3

32764

这是我得到的错误答案

21973

我不知道327641 5 4 1 2 8 9 3 0 1 5 1 3 9 的来源。

这是我期望的答案

Debug

有时我得到了错误的答案,有时我得到了正确的答案。怎么会这样 非常感谢!

1 个答案:

答案 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_arrn都必须为正值。使用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输入)

仔细检查一下,如果还有其他问题,请告诉我。