我有这个程序,我想了解以下输出:
#include <stdio.h>
void fastSwap (char **i, char **d)
{
char *t = *d;
*d = *i;
*i = t;
}
int main ()
{
char num1[] = "hellohello";
char num2[] = "classclass";
fastSwap ((char**)&num1,(char**)&num2);
printf ("%s\n",num1);
printf ("%s\n",num2);
return 0;
}
输出只会改变 sizeof(void*)
个字符,而不是整个数组。
为什么会这样?
&num1
是 char**
,不是吗?
最佳答案
&num1 is char** isn't it?
它是 char (*)[11]
。您转换为 char **
的事实破坏了编译器的警告。
您正在做的是完全未定义的行为。您不能让 num1
指向其他地方,因为它没有指向任何地方开始:它是一个数组,而不是一个指针。
编辑
正如 Paul R 所指出的,这可能是正在发生的事情。每个字符串的第一个 sizeof(char *)
字符被解释为一个指针,然后交换它们。发生什么本质上取决于您的实现中指针的大小。这很有趣,但我很确定它仍然符合未定义的条件。
关于c - 切换字符串c语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9180728/