为什么程序会保持打印垃圾值?

时间:2017-03-27 15:22:16

标签: c arrays pointers

我编写了一个函数,它接受一个指向索引的指针并检查它是否位于数组的限制范围内,如果它是真的,该函数会打印该数组中的其余元素,如果不是,则打印“{ {1}}”。此函数获取的唯一参数是数组,它的长度和指针。我遇到的问题是,负责迭代数组并打印数组其余部分的循环也会在数组中的最后一个元素之后打印垃圾值。

注意:你不能使用任何其他局部变量,只能使用参数(数组,长度,指针)。您也不能使用Not in range运算符,只能使用指针运算。

这是我的代码:

[]

3 个答案:

答案 0 :(得分:1)

应该是x < (arr + n),而不是x <= (arr + n)。请注意,代码中还有许多其他未经检查的条件。例如,您永远不会检查数组中的元素是否小于n

如果您不确定是使用<还是<=,您可以随时做一个简单的测试用例:假设您的数组有两个元素,然后arr + 0有效,arr + 1有效,arr + 2不有效。因此,n必须小于2。

答案 1 :(得分:1)

在for-loop中,您始终会从n开始打印x个数字。您还要将数组的第一个元素设置为零,并将其用作for (*arr = 0; *arr <= n; *arr++)中的迭代器。因此,您将打印超出阵列范围的数字。我建议在for循环中使用另一种方法,如下所示:

    for ( ; x != arr+n; x++)
    {
        printf("%d ", *x);
    }

答案 2 :(得分:0)

基于您所描述的规范,我认为这段代码存在两个问题:

for (*arr = 0; *arr <= n; *arr++)
{
    printf("%d ", *(arr + *x));
}

首先,那个循环是错误的。您正在比较arr指向的当前元素,并查看它是否小于数组的长度。你应该做的是使用n来限制你循环的次数。您还要将数组的第一个元素设为0。

其次,您要打印可能在数组之外的随机值,因为除非*x为0,否则您不会打印某个任意值,可能超出{{1 }}

第三,你的规范说你要在arr所指向的元素之后打印所有内容,并且你试图打印所有内容。

解决所有这三个问题,你最终得到了类似的代码。

x

正如其他地方所提到的那样,for (x++; x<arr+n; x++) { printf("%d ", *arr); } 应为if (x >= arr && x <= (arr + n)),否则如果if (x >= arr && x < (arr + n))是超出x