这个可能非常简单,但我似乎无法让它发挥作用。
我有这个非常简单的代码片段:
#include <stdio.h>
#include <string.h>
int main(void)
{
char buf[100];
char *p = buf;
strcpy(p, "Test string");
printf("%s\n", *p);
}
运行时会导致分段错误。 GDB输出:
Program received signal SIGSEGV, Segmentation fault.
0xb76af3b3 in strlen () from /lib/i686/cmov/libc.so.6
但我仍然没有得到它。
评论将不胜感激,谢谢。
答案 0 :(得分:12)
写作时
printf("%s\n", *p);
*p
将是p[0]
处的字符值。然而,printf正在寻找一系列字符,从而导致它出现段错误。请记住,在C中,字符串只是字符数组,而数组实际上是指向第一个元素的指针,这就是您不需要取消引用的原因。
要解决此问题,请删除*以获取:
printf("%s\n", p);
答案 1 :(得分:10)
你将一个角色传递给printf;你应该传递指针。
char buf[100];
char *p = buf;
strcpy(p, "Test string");
printf("%s\n", p); // p, not *p
答案 2 :(得分:4)
使用此:
printf("%s\n", p);
使用“p”代替“* p”
答案 3 :(得分:3)
替换
printf("%s\n", *p);
与
printf("%s\n", p);
当您使用%s
时,printf希望您传递char*
。您正在传递char
。
答案 4 :(得分:2)
只传递字符串(指针):
printf("%s\n", p);
如果要打印第一个字符,则:
printf("%c\n", *p);
答案 5 :(得分:0)
%s导致printf()取消引用* p。假设字符串是“Test string”。 然后在我的Solaris sparc框中:(在测试程序中)p将“瞄准”地址0x54657374。该特定地址成为您的处理空间一部分的概率几乎为零。
这就是导致SIGSEGV信号(segfault)的原因。