C:使用printf时出现分割错误
这一个可能很简单,但我似乎无法得到它的工作。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
但我仍然不明白。
评论将不胜感激,谢谢。
当你写
printf("%s\n", *p);
的*p
将在p[0]
其值是一个字符。然而,printf正在寻找一个字符数组,从而导致它出现段错误。请记住,在C中,字符串只是字符数组,而数组实际上是指向第一个元素的指针,这就是为什么你不需要解引用。
为了解决这个问题删除*获得:
printf("%s\n", p);
Hello Il-Bhima,感谢您的明确解释。 – Hamza 2010-06-04 17:04:41
您正在将一个字符传递给printf;你应该传递指针。
char buf[100];
char *p = buf;
strcpy(p, "Test string");
printf("%s\n", p); // p, not *p
啊,是的。当我遵从p时,我得到一个字符,因此printf的混淆。这听起来是对的吗?谢谢。 – Hamza 2010-06-04 17:01:10
+1成为第一个回答 – neuro 2010-06-04 17:03:27
当你通过'* p'时,你只传递一个字符值。当你传递'p'时,你传递一个指向字符串中第一个字符的指针,所以printf可以访问字符串的其余部分。 – zildjohn01 2010-06-04 17:05:51
更换
printf("%s\n", *p);
与
printf("%s\n", p);
当您使用%s
,printf的期望你传递一个char*
。您正在通过char
。
只是传递字符串(指针):
printf("%s\n", p);
如果你要打印的第一个字符,则:
printf("%c\n", *p);
谢谢为解释AraK。 – Hamza 2010-06-04 17:04:03
%s的原因printf()的取消引用* P。假设字符串是“测试字符串”。 然后在我的Solaris sparc框中:(在一个测试程序中)p将“针对”地址0x54657374。该特定地址成为过程空间的一部分的概率接近于零。
这是什么导致了SIGSEGV信号(段错误)。
你可能已经看了GCC警告,以获得问题的一个想法: test.c的:在函数“主”: 测试。c:12:警告:格式'%s'需要键入'char *',但参数2的类型为'int' – 2010-06-04 17:23:47
足够滑稽我没有得到那个警告信息,如果我这样做了,我可能会挽救所有人,包括我自己:) – Hamza 2010-06-04 17:32:42
您可能想要确保使用'-Wall'编译器标志来确保不会错过警告。 – VeeArr 2010-06-04 18:53:07