【发布时间】:2015-04-18 13:42:13
【问题描述】:
我注意到,当通过指针打印字符串时,指针不应被取消引用。为什么?
$ cat c.c
#include <stdio.h>
int main(){
char foo[] = "Meirav";
char *bar = foo;
printf("%s\n", foo);
printf("%s\n", bar); // Why isn't this dereferenced?
printf("%p\n", bar);
return 0;
}
$ gcc -Wextra c.c
$ ./a.out
Meirav
Meirav
0x7fffda789ae0
这是取消引用指针的结果,我收到编译器警告和运行时错误:
$ vim c.c
$ grep '&bar' c.c
printf("%s\n", &bar);
$ gcc -Wextra c.c
c.c: In function ‘main’:
c.c:8:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char **’ [-Wformat=]
printf("%s\n", &bar);
^
$ ./a.out
Meirav
��~|�
0x7fff7c7eafa0
为什么不应该取消引用指针?
这是我的环境:
$ uname -a
Linux melancholy 3.13.0-48-generic #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ cat /proc/version
Linux version 3.13.0-48-generic (buildd@orlo) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015
$ cat /etc/issue
Ubuntu 14.04.2 LTS \n \l
【问题讨论】:
-
&bar不会取消引用指针bar。它给出了指针的地址,即char**。取消引用=*bar -
为什么你认为应该这样做?
-
为什么会这样?
"%s"需要一个指向 char 的指针。bar是指向 char 的指针 -
@bolov:谢谢,您的评论让问题变得清晰。