切换字符串c语言

时间:2012-02-07 17:18:05

标签: c string char

我有这个程序,我想了解以下输出:

#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*)个字符,而不是整个数组。

为什么会这样?

&num1char**,不是吗?

4 个答案:

答案 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 **指针中。