我有一个函数,它将char *作为唯一的参数。然后我对它执行一些strtok操作。有时它有效,有时甚至有效。它的工作取决于字符串的构造方式。例如,这是两种情况。
int main()
{
char glob[] = "/abc/def/ghi";
char *glob2 = "/abc/def/ghi";
func(glob); //this one works
func(glob2); //this one doesnt work
return 0;
}
两种分配方法之间有什么区别?为什么strtok会在第二种分配方法上爆炸?
答案 0 :(得分:12)
strtok()
基本上修改了输入字符串。
char *glob2 = "/abc/def/ghi";
在上面的情况下,glob2
指向只读数据,因此它失败,而使用'char glob[] = "/abc/def/ghi";
'数据不是只读的,它在char数组中可用。因此它允许修改。
答案 1 :(得分:7)
char [] str1 =“foo”在堆栈上分配一个chars数组(假设它在一个函数内)。可以毫无问题地修改该数组。
const char * str =“foo”为您提供了一个指向字符串foo的指针,该字符串通常位于只读内存中。
char * str =“foo”将执行相同的操作但隐式删除const(实际上没有改变指针可能指向只读内存的事实)。
答案 2 :(得分:6)
Strtok写入分配给字符串的内存。
您无法在大多数编译器/运行时/硬件上写入静态分配的字符串内存。你可以写入堆栈。
答案 3 :(得分:-1)
其他评论是正确的;你应该使用strtok_r()代替。