你初步化了char *
什么?
如果有的话
char *text = "foobar";
然后你有一个指向一些只读字符的指针
对于
char text[7] = "foobar";
然后你有一个七元素的字符数组,你可以做你喜欢的.
strtok
写入你给它的字符串 - 覆盖分隔符字符null
并保持指向字符串其余部分的指针.
因此,如果您传递一个只读字符串,它将尝试写入它,并且您得到一个段错误.
此外,因为strtok
保持对字符串其余部分的引用,它不是reeentrant - 您一次只能在一个字符串上使用它.最好避免,真的 - 考虑strsep(3) - 例如,请参阅:http://www.rt.com/man/strsep.3.html(虽然仍然写入字符串所以具有相同的读取-only/segfault问题)
你初步化了char *
什么?
如果有的话
char *text = "foobar";
然后你有一个指向一些只读字符的指针
对于
char text[7] = "foobar";
然后你有一个七元素的字符数组,你可以做你喜欢的.
strtok
写入你给它的字符串 - 覆盖分隔符字符null
并保持指向字符串其余部分的指针.
因此,如果您传递一个只读字符串,它将尝试写入它,并且您得到一个段错误.
此外,因为strtok
保持对字符串其余部分的引用,它不是reeentrant - 您一次只能在一个字符串上使用它.最好避免,真的 - 考虑strsep(3) - 例如,请参阅:http://www.rt.com/man/strsep.3.html(虽然仍然写入字符串所以具有相同的读取-only/segfault问题)
推断但未明确说明的重点:
基于你的问题,我猜你在C语言编程方面还是比较新的,所以我想先解释一下你的情况.如果我弄错了,请原谅我; C可能很难学习,主要是因为底层机制的细微误解,所以我喜欢尽可能简单.
如您所知,当您编写C程序时,编译器会根据语法为您预先创建所有内容.在代码中的任何位置声明变量时,例如:
int x = 0;
编译器读取这行文本并对自己说:好的,我需要用当前x
分配给整数的内存区域的常量引用替换当前代码范围内的所有实例.
当你的程序运行时,这一行导致一个新的动作:我需要设置x
引用int
值的内存区域0
.
请注意这里的细微差别:参考点x
保持的内存位置是恒定的(并且不能更改).但是,x
可以更改点的值.您可以通过分配在代码中执行此操作,例如x = 15;
.另请注意,单行代码实际上相当于编译器的两个单独命令.
如果您有以下声明:
char *name = "Tom";
编译器的过程是这样的:好的,我需要将当前代码范围内的所有实例替换name
为对已分配用于保存char
指针值的内存区域的常量引用.它就这样做了.
但是还有第二步,相当于:我需要创建一个恒定的字符数组,其中包含值'T','o','m'和NULL
.然后我需要"Tom"
用该常量字符串的内存地址替换代码部分.
运行程序时,最后一步是:将指针char
的值(不是常量)设置为自动创建的字符串的内存地址(这是常量).
所以a char *
不是只读的.只有a const char *
是只读的.但是在这种情况下你的问题不是char *
s是只读的,而是你的指针引用了只读内存区域.
我提出这一切是因为理解这个问题是你从库中查看函数定义与自己理解问题与不得不问我们之间的障碍.我有点简化了一些细节,希望能让这个问题更容易理解.
我希望这可以帮到你.;)