我正在編寫一個C程序來計算Spearman係數。它工作正常,但是當我使用將變量的引用分配給指針會導致意外行爲
*spearmanCoefficient = coeff;
我得到這樣的輸出:Spearman: 0.01
,當我使用
spearmanCoefficient = &coeff;
我得到這樣的輸出:Spearman: 15707109983512927750860237824432537600.00
然而,correlationFlag = &corrFlag;
給我正確的輸出。
如果正確地明白,第一個語句分配變量coeff
的指針spearmanCoefficient
和第二語句的值的值分配可變coeff
的指針spearmanCoefficient
的地址這將導致相同的輸出,但輸出表明第二條語句引用變量的地址而不是其值。
任何人都可以解釋爲什麼發生這種情況?謝謝。
源代碼:
#include <stdio.h>
#include <math.h>
_Bool Correlate (int size, float arrayOne[], float arrayTwo[], float *spearmanCoefficient, float *correlationFlag)
{
if (size > 0) {
float sumOne = 0.0f;
float sumTwo = 0.0f;
for (int i = 0; i < size; i++) {
sumOne = sumOne + arrayOne[i];
sumTwo = sumTwo + arrayTwo[i];
}
float meanOne = sumOne/(float)size;
float meanTwo = sumTwo/(float)size;
float varianceOne = 0.0f, varianceTwo = 0.0f;
for (int i = 0; i < size; i++) {
sumOne = sumOne + pow((arrayOne[i] - meanOne), 2);
sumTwo = sumTwo + pow((arrayTwo[i] - meanTwo), 2);
}
varianceOne = sumOne/(float)size;
varianceTwo = sumTwo/(float)size;
float coeff = 0.0f;
float corrFlag = 0.0f;
for (int i = 0; i < size; i++) {
coeff = coeff + (((arrayOne[i] - meanOne) * (arrayTwo[i] - meanTwo))/(size * sqrt(varianceOne * varianceTwo)));
}
spearmanCoefficient = &coeff;
if (coeff >= 0.9 && coeff <= 1.0) {
corrFlag = 1.0;
} else if (coeff >= -1.0 && coeff <= -0.9) {
corrFlag = -1.0;
} else {
corrFlag = 0.0;
}
correlationFlag = &corrFlag;
return 1;
}
else {
return 0;
}
}
int main() {
float arrayOne[10] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
float arrayTwo[10] = {4.0, 6.0, 9.0, 10.0, 2.0, 3.0, 5.0, 5.0, 6.0, 8.0};
int size = 10;
float *spearmanCoefficient;
float *correlationFlag;
_Bool var = Correlate(size, arrayOne, arrayTwo, spearmanCoefficient, correlationFlag);
printf("Spearman: %.2f\n", *spearmanCoefficient);
printf("Flag: %.2f\n", *correlationFlag);
return 0;
}
在'main'沒有指向任何地方這些指針。 – Kevin
您的函數不會更新指針,因爲它們是按值傳遞的。如果指針已更新,它仍然無法工作,因爲它們會指向不再存在的局部變量。 –