如何在c语言中打印指针?

3
有人能解释一下为什么这段代码会导致分段错误吗?
char string[] = "this is a string";
char * string2 = "this is another string";
printf("%s\n",string );
printf("%s\n",  string2);
printf("string[2]= %s, string2 = %s\n", string[2], &string2 );

当我尝试打印时,它也会出现相同的错误。
*string2 or *string2[2] or &string2[2]

我对此非常困惑,类似网站上看到的例子都可以打印但这个不行。


你可能想看一下这个问题:正确的格式说明符以打印指针(地址)? - m01
2个回答

10

前两个没问题,但在最后一个里你可能想要:

printf("string[2]= %c, string2 = %p\n", string[2], (void *)&string2 );
                    ^             ^

你之所以出现分段错误,是因为你让printf将一个小整数(string[2])解释为指针(这是%s所期望的)。


4
这是 %p 想要的:一个 void *,而不仅仅是任何类型的指针。在大多数机器上可能没有什么区别,但遵循规则是好的。 - cnicutar
@zubergu 不行。首先,因为“隐式转换”是个自相矛盾的词,按定义来说,转换都是显式的。其次,如果你指的是“隐式转换”,那也不会发生——printf()并非魔法。编译器也不是。类型转换规则不会根据随机字符串(在这种情况下是printf()的转换说明符)而改变。 - user529758

0
char * string2 = "this is another string";  

声明使 string2 指向 t(字符串的第一个字符),这并不意味着 *string2 是整个字符串(在解引用 string2 时),即 "this is another string"。如果您尝试使用 %s 打印 *string2,它将导致分段错误,但使用 %c 将打印 t
要打印指针,请使用 %p 格式说明符。


3
“指向字符串的指针”在定义上是一个指向字符串第一个字符的指针;该术语在C标准7.1.1段落1中进行了定义。(如果缺乏这个定义,“指向字符串的指针”可能没有意义,因为“字符串”是一种数据布局,而不是一种类型。) - Keith Thompson
1
@Jon 除了Keith的精彩解释之外,如果我告诉你C语言中有指向数组的指针呢? char (*arrptr)[10] = &some_char_array; - user529758
1
@Jon:一个字符串是一个数组。如果你想要“指向一个字符串”而不仅仅是“指向一个字符串的第一个字符”,那么你需要使用指向数组的指针,按照定义它会指向整个字符串。是的,我用挑剔的方式回应挑剔的人。 - user529758
1
@H2CO3:很抱歉让你失望,但“字符串是由第一个空字符终止并包括在内的连续字符序列”,而不是像你说的“数组”-- 数组是完全不同的东西,此外,如果你停止挑剔,你可以自己想到一些外行人的反例。 - Jon
1
@Jon 不是这样的。那你如何解释字符串字面值具有类型 char [N + 1](其中 N 是字符串的长度)呢? - user529758
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接