【问题标题】:Swapping elements in Array of Pointers交换指针数组中的元素
【发布时间】:2026-01-22 23:40:01
【问题描述】:

我在 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;
  }
} 

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

【问题讨论】:

  • 请提供minimal reproducible example 来证明您的问题。它应该特别展示是什么让您认为显示的代码有任何问题。理想情况下,展示不止一种尝试以及它们失败的不同方式。另外,我看不到“用下一个交换第一个元素”如何描述第一个显示的数组和第二个显示的数组之间的区别。请解释一下。
  • 就像一般评论一样,我认为在编写这样的函数时最好将数组的大小作为参数。您在代码中使用的字面量越少,它就越灵活且易于调整

标签: arrays c pointers swap


【解决方案1】:

你的代码有两个问题-

  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 &lt; 6更改为i &lt; 5(原因在上面第1点中提到)。正如 ikegami 所提到的,最佳做法是将数组大小作为参数传递(例如 n)并在循环条件中使用 n - 1
  • 逻辑是固定的(如上面第 2 点所述)
  • 对于交换,使用char * 而不是void *Arr 中的元素类型为char *
  • ArrSwap() 的返回类型被称为voidvoid 清楚地表明ArrSwap() 不会返回任何内容。

修复后inputs 将是:

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

【讨论】:

  • 我以为是他们描述的那样,但没看到想要的输出匹配......
  • 我建议还提及并解释您修复的返回值默认值。
  • char *temp 也会更好。
  • Re "注意索引从 6 变为 5",6 实际上很好(使用i+=2),6 是我会使用的。 (好吧,实际上,我会使用n,这是一个接受数组大小的参数。)
  • @ikegami,如果有奇数个元素,比如 7,循环条件应该是