2010-06-04 57 views
4

这一个可能很简单,但我似乎无法得到它的工作。C:使用printf时出现分割错误

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

#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 

但我仍然不明白。

评论将不胜感激,谢谢。

+1

你可能已经看了GCC警告,以获得问题的一个想法: test.c的:在函数“主”: 测试。c:12:警告:格式'%s'需要键入'char *',但参数2的类型为'int' – 2010-06-04 17:23:47

+0

足够滑稽我没有得到那个警告信息,如果我这样做了,我可能会挽救所有人,包括我自己:) – Hamza 2010-06-04 17:32:42

+0

您可能想要确保使用'-Wall'编译器标志来确保不会错过警告。 – VeeArr 2010-06-04 18:53:07

回答

11

当你写

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

*p将在p[0]其值是一个字符。然而,printf正在寻找一个字符数组,从而导致它出现段错误。请记住,在C中,字符串只是字符数组,而数组实际上是指向第一个元素的指针,这就是为什么你不需要解引用。

为了解决这个问题删除*获得:

printf("%s\n", p); 
+0

Hello Il-Bhima,感谢您的明确解释。 – Hamza 2010-06-04 17:04:41

10

您正在将一个字符传递给printf;你应该传递指针。

char buf[100]; 
char *p = buf; 

strcpy(p, "Test string"); 

printf("%s\n", p);  // p, not *p 
+0

啊,是的。当我遵从p时,我得到一个字符,因此printf的混淆。这听起来是对的吗?谢谢。 – Hamza 2010-06-04 17:01:10

+0

+1成为第一个回答 – neuro 2010-06-04 17:03:27

+2

当你通过'* p'时,你只传递一个字符值。当你传递'p'时,你传递一个指向字符串中第一个字符的指针,所以printf可以访问字符串的其余部分。 – zildjohn01 2010-06-04 17:05:51

3

更换

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

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

当您使用%s,printf的期望你传递一个char*。您正在通过char

+0

嗨埃里克,谢谢 - 修复它,虽然我不明白为什么。我们不应该引用指针来获取内容吗? – Hamza 2010-06-04 16:59:43

+0

@Hamza - 只有当你想打印一个字符。如果要打印整个字符串,则需要传递指针,以便printf可以访问它。否则,它所拥有的就是你传递它的字符(而不是字符串的其余部分)。这更有意义? – 2010-06-04 17:02:00

+0

这是我正在寻找的解释,非常感谢!在使用高级语言一段时间之后忘记原理是多么的容易:) – Hamza 2010-06-04 17:03:30

2

只是传递字符串(指针):

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

如果你要打印的第一个字符,则:

printf("%c\n", *p); 
+0

谢谢为解释AraK。 – Hamza 2010-06-04 17:04:03

4

使用此:

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

使用“ p“而不是”* p“

+0

感谢您的解答user358443 – Hamza 2010-06-04 17:05:41

0

%s的原因printf()的取消引用* P。假设字符串是“测试字符串”。 然后在我的Solaris sparc框中:(在一个测试程序中)p将“针对”地址0x54657374。该特定地址成为过程空间的一部分的概率接近于零。

这是什么导致了SIGSEGV信号(段错误)。