我有这个程序,我想了解以下输出:
#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**
,不是吗?
答案 0 :(得分:5)
&amp; num1是char **不是吗?
这是char (*)[11]
。您转换为char **
的事实破坏了编译器的警告。
您正在做的是完全未定义的行为。你不能让num1
指向其他地方因为它不指向任何地方开头:它是一个数组,而不是一个指针。
正如Paul R所指出的,这是可能发生的事情。每个字符串的第一个sizeof(char *)
字符被解释为指针,然后交换它们。发生的事情主要取决于实现中指针的大小。这很有意思,但是我很确定它仍然是未定义的。
答案 1 :(得分:1)
正如其他一些帖子所指出的,num1和num2是数组,而不是指向字符串的指针。 看起来意图是交换2个char指针。 所以重写这样的东西应该有用。
#include <stdio.h>
void fastSwap (char **i, char **d)
{
char *t = *d;
*d = *i;
*i = t;
}
int main ()
{
char * num1 = "hellohello"; // Note making a pointer rather than array.
char * num2 = "classclass";
fastSwap (&num1,&num2); // Shouldn't need the casts.
printf ("%s\n",num1);
printf ("%s\n",num2);
return 0;
}
答案 2 :(得分:0)
您应该交换指针本身的值(但它们不是指针而是数组)或使用for循环逐个交换每个字符(或使用类似strcpy / strncpy的C函数进行交换和使用作为临时变量的外部变量。)
答案 3 :(得分:0)
如果您打印num1和&amp; num1的指针值,您将获得相同的值。所以你基本上会复制(char **)大小的第一个字节,这就是全部。
数组不是指针。它可以在许多操作中运行相同,但事实并非如此。 相当确定编译器直接将数组的位置存储在代码中,而不是将指针存储在char **指针中。