2012-11-24 25 views
1

程序很長(這裏是完整版本:http://pastebin.com/cvg1eSJ1),(sample.txt如下所示:http://pastebin.com/hWihPpSj,它是INPUT文件,另一個命令行參數是輸出文件。 ),但我發佈了處理「第二指針列表」的部分。基本上我有一個47個左右的項目列表,我需要添加一定範圍之外的項目到第二個列表。這是我第一次保存值的地方。我使用「tempAddress」只是爲了清理代碼。我只是將當前地址的值,檢查它,如果它匹配,然後將其添加到第二個閱讀列表。指針存儲器中的最後一個值不正確

for (i; i < numElements; i++) { 
     tempAddress = firstReadingList++; 
     if ((double) *tempAddress > plusOutlier || (double) *tempAddress < minusOutlier) { 
      *secondReadingList++ = *tempAddress; 

      numOutliers++; 
      printf("%d ", *tempAddress); 
     } 
    } 

後來,我不得不在另一個函數中寫這個讀取列表到一個文件。我打印出來的值,只有最後一個值是不正確的。我不知道爲什麼。這裏是我並寫入到文件中的代碼(tempAddress是在這種情況下,一個新的變量)

for (i; i < numElements; i++) { 
    tempAddress = (outlierList + i); 
    printf("%d ", *tempAddress); 
    fprintf(out, "%d ", *tempAddress); 
} 

在所述第一函數的輸出如下所示:

752 843 840 848 752 850 753(這是正確的)

第二個代碼片段輸出這個

752 843 840 848 752 850 577(577是不正確的)

難道我做錯了什麼?我還是比較新的指標。我不會在函數之間的任何點修改secondListPointer。

+0

*「程序很長,但我發佈了相關部分。」* - 如果您不明白錯誤是什麼,您如何知道哪些部分是相關的? – melpomene

+0

我的意思是這是第二個指針列表被引用的唯一部分。該程序的其餘部分只是處理初始化第一個列表,其中的數據是正確的(平均值,標準差等) –

+0

我甚至不知道你指的是什麼*指針列表*所以我不能幫你所有。另外,*第二個指針列表*?第一個是什麼? – melpomene

回答

1

你打電話get_outliers之前,您一個int分配內存:

int *outlierList = malloc(sizeof *outlierList); 

int numOutliers = get_outliers(dataPointer, numReadings, outlierList, average, stdDev, STDDEV_SCALAR); 

但可能有不止一個離羣。然後你在分配的內存之外寫入,調用未定義的行爲,帶來不可預見的後果。在這裏,只有一些數據被破壞。

+0

所以我應該使用calloc,其大小是異常值的數量?在那之前我不會有多少異常值。 –

+1

'malloc'或'calloc'不是那麼重要,但是您必須爲所有異常值分配足夠的空間。安全選項是'malloc(numReadings * sizeof * outlierList);'(如果'numReadings'實際上是元素的總數),但是您也可以分配更少的數量(您期望的數量和稍微的餘地)。而且你需要記錄異常值的數量,如果分配的空間已滿,請作出反應。 –

+0

完全修復它的WOW。非常感謝。我沒有意識到它被破壞了,因爲我覺得像損壞的數據看起來像是弄亂​​了文本或其他東西,或者給出錯誤。這固定完美。 –