c字符串分配差异?

时间:2009-08-04 14:07:44

标签: c

我有一个函数,它将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会在第二种分配方法上爆炸?

4 个答案:

答案 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()代替。