交换指针数组中的元素

Swapping elements in Array of Pointers

我在 C 中有以下数组(使用随机名称)

char * inputs[6] = {
  "Kangaroo my shoe", "Fly high dragonfly",
  "Philosophical Monkey", "Jumping Ape",
  "Fearful lemurs", "Tall Giraffes"
};

目标是将第一个元素与下一个元素交换。如要执行此操作

char * inputs[6] = {
  "Fly high dragonfly", "Kangaroo my shoe",
  "Jumping Ape", "Philosophical Monkey",
  "Tall Giraffes", "Fearful lemurs"
};

我已经尝试了以下以及更多。

ArrSwap(char *Arr[]){
  int i;
  for(i=0;i<6;i++){
    void*temp = Arr[i];
    Arr[i]=Arr[i+1];
    Arr[i+1] = temp;
  }
} 

提前致谢!我花了几个小时试图解决这个问题,每次我这样做都会以混乱的顺序结束,或者没有交换第一个和最后一个预期的任何元素。

你的代码有两个问题-

  1. 在函数 ArrSwap() 中,您在索引 0 到 5 之间循环。因此,当 i 变为 5 时,Arr[i+1] 指向 Arr[6],这导致从超出数组边界的内存中读取。这是未定义的行为。
  2. 其次,如果我的要求正确,你想交换交换的第一个和第二个元素,然后是第三个和第四个,依此类推。所以,你的代码有逻辑错误。在这种情况下,在 ArrSwap() 中,循环需要递增 2 而不是 1。

所以在解决了这两个问题之后,代码可能看起来像这样 -

void ArrSwap(char *Arr[]){
    int i;
    for(i=0; i<5; i+=2) {
        char *temp = Arr[i];
        Arr[i]=Arr[i+1];
        Arr[i+1] = temp;
    }
}

请注意 ArrSwap() 函数中进行了以下更改 -

  • 环路测试条件由i < 6变为i < 5(原因在上面第1点说的)。正如 ikegami 提到的,最佳做法是将数组大小作为参数传递(比如 n)并在循环条件中使用 n - 1
  • 逻辑固定(如上第2点所述)
  • 交换时,使用char *代替void *Arr中的元素类型为char *
  • ArrSwap() 的 return 类型被称为 voidvoid 清楚地表明 ArrSwap() 不会 return 任何东西。

修复后 inputs 将是:

{"Fly high dragonfly", "Kangaroo my shoe", "Jumping Ape", "Philosophical Monkey", "Tall Giraffes", "Fearful lemurs"}