2013-04-11 54 views
0

我已經創建了動態數組。如果具有某些值,則填充。打印它。但互換/交換指針後(該任務是交換某些條件的線路)交換/交換指針時未定義的行爲

條件取決於sumL。爲了不浪費時間,我沒有詳細描述細節。

的問題是交換指針。

for (k = 0; k < N - 1; k++) 
{ 
    for (i = 0; i < N - 1; i++ 
     if (sumL[i] > sumL[i+1]) 
     { 
      temp = sumL[i];   // works 
      sumL[i] = sumL[i+1]; 
      sumL[i+1] = temp; 

      temp = *a[i];    // doesn't work. Array is not the same: elements 
      a[i] = a[i+1];    // contain other values. 
      *a[i+1] = temp;   /* What is wrong? */ 
     } 
} 
+2

哪些變量類型?我很驚訝地發現,只有四個訪問中只有兩個訪問被解除引用。 – 2013-04-11 19:54:31

回答

2

如果你想要交換指針,那麼它也許應該讀

temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; 

如果你想要交換價值,那麼它也許應該讀

temp = *a[i]; *a[i] = *a[i+1]; *a[i+1] = temp; 
+0

第二個變體不會交換「指針」......有些元素會改變它們的值。 – yulian 2013-04-11 20:04:52

+1

@ Genuine.Zealot這就是爲什麼他在第二個變體之前寫下「如果你想交換數值」的原因。 – 2013-04-11 20:08:55

+0

哦,理解! 我是C新手,對我在這個問題上的不足知識表示歉意。 – yulian 2013-04-11 20:12:35

1

你可以嘗試

*a[i] = *a[i+1]; 
+0

這不會交換的價值,是嗎?它只是移動數組的值。 – Kninnug 2013-04-11 19:55:45

+1

當然,這應該包含在正確的位置,而不是'a [i] = a [i + 1]',而不是替換整個塊。 – Fabien 2013-04-11 19:58:40

+0

啊,這是有道理的。 – Kninnug 2013-04-11 20:01:41

1
temp = *a[i];    //temp == value pointed by a[i], NOT pointer 
a[i] = a[i+1];    // here you actually copy the pointer 
*a[i+1] = temp;   // here you again write value, NOT pointer 

你應該這樣做:

type* temp_ptr = a[i];  
a[i] = a[i+1]; 
a[i+i] = temp_ptr; 
+0

我製作了**指針**的變量'temp'。它似乎在工作......我必須驗證結果.. – yulian 2013-04-11 20:10:32