字符串中“* p”和“p”的格式说明符%s和%c之间的差异

时间:2016-09-10 03:20:25

标签: c pointers

为什么这个程序表现得像这样?

#include <stdio.h>
main()
{
char *p = "Pointers";
printf("%s", p);
}

输出:指针

这里我尝试使用“* p”打印字符串值,但在编译时崩溃。如果我使用“p”打印值,则表示打印字符串而不是“p”

的内存位置地址

请帮助解决此问题

2 个答案:

答案 0 :(得分:2)

printf需要%s格式说明符的指针。如果您传入*p,则会取消引用p并实际传入字符串的第一个字节(例如&#39; P&#39;)。然后printf正在处理第一个&#39; P&#39;将您的字符串作为指针,并将其引导至无效的内存位置。

作为一般规则,在C中,您通常不会按值传递字符串。而是将指针传递给字符串。

答案 1 :(得分:0)

如果您想要打印p变量的地址的值[vs.它指向的是什么,使用:

printf("%p\n",&p);

这将为您提供堆栈上p的地址,该地址应该是一个相当高的内存地址(例如0x7ffdb4066268)。

如果您希望p所指向的字符串常量的地址为{字符串],执行:

printf("%p\n",p);

您将获得0x400xxx

之类的内容