2016-01-13 26 views
0

考虑下面的程序为什么strtok在给定一个*字符串时发生段错误,但是当给定一个字符串[]时不会发生段错误?

#include <stdio.h> 
#include <string.h> 

int main() { 
    char *str = "This is a test."; 
    char *token; 

    token = strtok(str," "); 
} 

它会出现段错误。但是,如果我将* str改为str [80],则不会。为什么是这样?

谢谢

+0

你知道数组和指针之间的区别吗? – immibis

+0

是的。你是说* str失败,因为它是一个指针,而str []是一个数组? [这个链接](http://www.lysator.liu.se/c/c-faq/c-2.html)说:“由于数组立即衰变成指针,数组永远不会传递给函数。”这让我相信,在这两种情况下,我都会传递一个指向strtok的指针。 – DJames

+0

是的。然而,在工作情况下,您正在向*您的数组*传递一个指针,而在非工作情况下,您将传递一个指向*字符串文字*的指针。 – immibis

回答

3

麻烦的是,类型是错误的。

char *str = "This is a test."; 

可能说char*,但右边的东西实际上是char const*(C是允许类型双关语十分宽松(是正确的单词))。任何修改const的尝试都是未定义的行为。

函数strtok()实际上修改了底层字符串(通过插入'\ 0'),所以这是未定义的行为。

通过这样做来修复。

char str[] = "This is a test."; 
相关问题