2013-04-11 83 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