2017-03-27 84 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!你是對的 - 原始代碼在它試圖做的事情上非常誤導。 –