c字符串分配差异?

Mat*_*att 3 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;
}
Run Code Online (Sandbox Code Playgroud)

两种分配方法之间的区别是什么?为什么strtok会在第二种分配方法上爆炸?

aJ.*_*aJ. 12

strtok() 基本上修改输入字符串.

char *glob2 = "/abc/def/ghi";
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,glob2指向只读数据,因此它失败,而' char glob[] = "/abc/def/ghi";'数据不是只读的,它在char数组中可用.因此它允许修改.


sep*_*p2k 7

char [] str1 ="foo"在堆栈上分配一个chars数组(假设它在一个函数内).可以毫无问题地修改该阵列.

const char*str ="foo"为您提供了一个指向字符串foo的指针,该字符串通常位于只读内存中.

char*str ="foo"将执行相同的操作但隐式删除const(实际上没有改变指针可能指向只读内存的事实).


kma*_*rsh 6

Strtok写入分配给字符串的内存.

您无法在大多数编译器/运行时/硬件上写入静态分配的字符串内存.你可以写入堆栈.