[英]Can someone explain output of this program?
这个程序的输出是:
XBCDO 海尔
有人可以解释为什么会这样吗?
#include<stdio.h>
void swap(char **p, char **q) {
char *temp = *p;
*p = *q;
*q = temp;
}
int main() {
int i = 10;
char a[10] = "HELLO";
char b[10] = "XBCDE";
swap(&a, &b);
printf("%s %s", a, b);
}
您对指针和数组之间的区别感到困惑。 (这是该语言的一个令人困惑的部分。) swap
需要指向指针的指针,但您已经给了它指向数组的指针。 这是一个如此严重的错误,即使您没有打开任何警告,GCC 也会发出警告(它应该发出硬错误,但是一些非常非常旧的代码故意这样做,他们不想破坏它)。
$ gcc test.c
test.c: In function ‘main’:
test.c:16:10: warning: passing argument 1 of ‘swap’ from incompatible pointer type [-Wincompatible-pointer-types]
swap(&a, &b);
^
test.c:3:1: note: expected ‘char **’ but argument is of type ‘char (*)[10]’
swap(char **p, char **q)
^~~~
test.c:16:14: warning: passing argument 2 of ‘swap’ from incompatible pointer type [-Wincompatible-pointer-types]
swap(&a, &b);
^
test.c:3:1: note: expected ‘char **’ but argument is of type ‘char (*)[10]’
swap(char **p, char **q)
^~~~
该错误导致程序具有未定义的行为——它根本不需要做任何有意义的事情。
您可能尝试编写的程序如下所示:
#include <stdio.h>
static void swap(char **p, char **q)
{
char *temp = *p;
*p = *q;
*q = temp;
}
int main(void)
{
char a[10] = "HELLO";
char b[10] = "XBCDE";
char *c = a;
char *d = b;
swap(&c, &d);
printf("%s %s", c, d);
}
该程序的输出是XBCDE HELLO
,我认为这正是您所期望的。 c
和d
实际上是指针,它们被设置为指向数组a
和b
的第一个元素; 当应用于c
和d
时, swap
按预期工作。
如果c
和d
与a
和b
不同没有任何意义,那么您需要掌握一本好的 C 教科书,并且需要阅读有关指针的章节并完成所有练习。 (如果它没有至少一整章关于指针的内容,加上练习,它就不是一本好的 C 教科书。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.