2017-03-27 79 views
1

我写了一个函数,它的指针索引,并检查是否它位于阵列的范围内,该功能打印出数组,如果它是真实的元素的其余部分,并且如果不是的话,它打印“Not in range” 。该函数获取的唯一参数是数组,它的长度和指针。我遇到的问题是负责迭代数组并打印数组其余部分的循环也会在数组中的最后一个元素后面输出垃圾数值。为什么程序不断打印垃圾值?

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

这里是我的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void printAfterX(int* arr, int n, int* x); 

int main() 
{ 
    int arr[] = { 4, 8, 6, 2, 1, 3, 5, 7, 8, 9, 5 }; 
    printAfterX(arr, 11, arr+6); 
    return 0; 
} 

void printAfterX(int* arr, int n, int* x) 
{ 
    if (x >= arr && x <= (arr + n)) //this checks if x is in the limits 
    { 
     x++; 
     for (*arr = 0; *arr <= n; *arr++) 
     { 
      printf("%d ", *(arr + *x)); 
     } 
    } 
    else 
    { 
     printf("Not in range "); 
    } 
} 
+0

使用去开溜的长度,看看什么样的价值你逝去的'X '。 –

+1

1)'(arr + n)'超过了数组,而不是它。2)'* arr'给出了一个存储在数组中的值(如果'arr'是有效的),所以根据长度检查它是没有意义的......实际上整个'for'循环需要被重新考虑。 – Dmitri

+0

'* arr <= n'检查值'arr'是否指向小于或等于元素的数量。 '* arr ++'将'arr'指向下一个元素,然后无理由解引用。 '*(arr + * x)'得到'x'指向的数组中的值,然后将其加入到'arr'中以获得指向元素'arr'指向的许多元素的指针,然后解引用以获得存储在那里的值(这几乎肯定是错误的事情)。 – Dmitri

回答

1

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

如果您不能确定是否使用<<=,你总是可以做你的头一个简单的测试用例:Asssume你的阵列有两个元素,然后arr + 0是有效的,arr + 1是有效的,arr + 2不是。因此,您的n必须小于2.

1

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

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

根据你描述的,我认为有两个问题,这段代码的规范:

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

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

其次,您打印的随机值可能在数组之外,因为除非*x为0,否则不打印任何值,可能超出arr的结尾。

第三,你的规范指出,要打印之后的所有元素指向x和你有点要打印的一切。

修复所有三个问题,你想最终的代码看起来像。

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

和其他地方提到这个if (x >= arr && x <= (arr + n))应该是if (x >= arr && x < (arr + n))否则你会没事的,如果x是一个元素超出了arr

+0

这将打印除*'x'之外的所有元素,规范要求在*'x'后打印所有元素。取决于如果这意味着包含'x''',或者需要'for(; x!= arr + n; x ++)'或'for(; ++ x!= arr + n;)' –

+0

Doh!你是对的 - 原始代码在它试图做的事情上非常误导。 –