交换指针数组中的元素
我在 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;
}
}
提前致谢!我花了几个小时试图弄清楚这一点,每次我这样做都会以混乱的顺序结束,或者没有交换第一个和最后一个预期的任何元素。
回答
您的代码中有两个问题-
- 在函数中,
ArrSwap()您在索引 0 到 5 上循环。因此,何时i变为5,Arr[i+1]指向Arr[6]哪个导致从超出数组边界的内存中读取。这是未定义的行为。 - 其次,如果我正确地得到您的要求,您想交换交换的第一个和第二个元素,然后是第三个和第四个,依此类推。所以,你的代码有一个逻辑错误。在这种情况下,在
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 点提到的原因)。正如池上所说,最佳实践是将数组大小作为参数传递(例如n)并n - 1在循环条件中使用。 - 逻辑是固定的(如上面第 2 点所述)
- 对于交换,使用
char *而不是void *(元素的类型Arr是char *) - 的返回类型
ArrSwap()被提及为void。随着void它清楚地传达,ArrSwap()不会返回任何东西。
修复inputs后将是:
{"Fly high dragonfly", "Kangaroo my shoe", "Jumping Ape", "Philosophical Monkey", "Tall Giraffes", "Fearful lemurs"}