2014-10-16 102 views
1

試圖寫這個程序有點有趣,但它給了我一些主要的悲傷。如果我只是拋棄我的功能一例,一切都可以正常工作,但是當我一次移動到兩個以上的案例時,他們就開始從對方那裏獲取價值。第一個函數使用第二個函數的第一個元素(在排序之前)將其最後一個元素(排序後)交換。陣列考慮對方的價值觀?

示例:valuesOne和valuesTwo應分別爲[3,5,9,27,31]和[1,1,5,6,18,102]。但最終分別爲[1,3,5,9,27]和[1,5,6,18,31,102]。誰能幫我這個?我覺得這可能是我的指針問題,但我現在纔剛剛開始學習。

CODE:

#include <stdio.h> 

int doubleMedian(int *values, int numValues); 

int main() { 
    int valuesOne[5] = {5, 31, 3, 9, 27}; 
    int valuesTwo[6] = {1, 6, 18, 1, 102, 5}; 

    int resultOne = doubleMedian(valuesOne, 5); 
    int resultTwo = doubleMedian(valuesTwo, 6); 

    printf("Double medians are %d and %d", resultOne, resultTwo); 
} 

int doubleMedian(int *values, int numValues) { 
    int temp = 0, pass = 0, medianNum = 0, median = 0; 

    printf("Before sort:\t"); 

    for(int x = 0; x < numValues; x++) { 
     printf("%d, ", values[x]); 
    } 

    printf("\n"); 

    while(pass < numValues) { 
     for(int x = 0; x < numValues; x++) { 
      if(values[x] > values[x + 1]) { 
       temp = values[x]; 
       values[x] = values[x + 1]; 
       values[x + 1] = temp; 
      } 
     } 
     pass++; 
    } 

    printf("After sort:\t"); 

    for(int x = 0; x < numValues; x++) { 
     printf("%d, ", values[x]); 
    } 

    if(numValues % 2 == 0) { 
     medianNum = (numValues/2) - 1; 
     median = values[medianNum + 1] + values[medianNum]; 
    } else { 
     medianNum = (numValues/2) - 1; 
     median = values[medianNum] * 2; 
    } 

    printf("\n\n"); 
    return median; 
} 

回答

5

您有一個關閉的情況的一個問題,在您的排序循環:

for(int x = 0; x < numValues; x++) 

應該

for(int x = 0; x < numValues-1; x++) 

,因爲你是在引用的項目x+1。此項目已超過傳入數組的末尾,因此訪問它是未定義的行爲。很多時候,未定義的行爲不會在異常中返回。相反,意想不到的價值在一些看似隨機的地方出現。在這種情況下,由於編譯器生成的內存佈局,它看起來像讀取第二個數組的第一個元素。

+0

感謝堆,不會說謊,這不是我今晚第一次犯一個愚蠢的錯誤,哈哈。乾杯! 編輯:好的解釋也是如此。 – jcockle2 2014-10-16 12:38:50

+1

正如@dasblinkenlight所說的,你來過array1的內存地址並讀取數組2的值。因爲兩個數組都放在彼此後面的堆棧中。所以你從array2的內存中讀取;) – andreashager 2014-10-16 12:40:02