与strtok奇怪的指针问题

时间:2015-05-07 08:16:12

标签: c pointers segmentation-fault printf strtok

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并将其打印出来来推崇它时,它只是返回了分段错误。不知道为什么会这样。

2 个答案:

答案 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开始接收字符串。