struct stat buf;
lstat(path, &buf)
char *p;
p = strtok(ctime(&buf.st_mtime)," ");
int i = 0;
while (p != NULL)
{
printf ("%s\n",p);
p = strtok (NULL, " ");
}
以上代码可以正常运行。
但是,我不明白为什么指针p
能够被打印,因为它指向strtok()
返回的第一个标记。
当我尝试通过将其更改为*p
并将其打印出来来推崇它时,它只是返回了分段错误。不知道为什么会这样。
答案 0 :(得分:2)
根据C11
标准,章节7.21.6.1,fprintf()
函数,%s
格式说明符,
s
如果不存在
l
长度修饰符,则参数应为指向字符类型数组的初始元素的指针。(280)数组中的字符为 写入(但不包括)终止空字符。
因此,基本上,%s
期望指向以空值终止的char
数组的指针,即字符串。
然后,根据strtok()
的[手册页](http://linux.die.net/man/3/strtok),它返回
指向下一个标记的指针
因此,在您的代码中
printf ("%s\n",p);
打印整个字符串 .OTOH,如果取消引用p
,它会提供char
,这不是%s
的有效参数,所以它会产生undefined behaviour,从而产生分段错误。
答案 1 :(得分:0)
printf
格式的 %s
需要打印第一个字符的地址。
如果你写printf ("%s\n",*p);
,你将第一个字符作为地址传递给printf。
EG。 Str =" 1234" ---> printf ("%s\n",*p);
- >表示printf从地址0x00000031开始接收字符串。