C:使用printf时出现分段错误

时间:2010-06-04 16:56:52

标签: c pointers printf segmentation-fault

这个可能非常简单,但我似乎无法让它发挥作用。

我有这个非常简单的代码片段:

#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

但我仍然没有得到它。

评论将不胜感激,谢谢。

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)的原因。