关于字符串(C)中的总线错误我感到困惑

-1 c string bus-error

我觉得在一个字符串中用C替换两个字符会让人感到困惑.当我将它设置为数组时,它会很好用:

char strBase[8] = "acbdefg";

在这种情况下,我可以交换任何角色.但是当我将其设置为字符串时,它会触发总线错误:

char *strBase = "acbdefg";

非常感谢任何人都可以解释它或给我一些暗示!

Jay*_*hoi 7

这里的区别在于

 char *strBase = "acbdefg"; 
Run Code Online (Sandbox Code Playgroud)

将放置acbdefg在内存的只读部分并strBase指向该内存,使得此内存上的任何写入操作都是非法的.

它没有名称,并且具有静态存储持续时间(意味着它在程序的整个生命周期中都存在); 和一个名为pointer-to-char的变量,调用它strBase,该变量初始化为该未命名的只读数组中第一个字符的位置.

做的时候:

char strBase[8] = "acbdefg";
Run Code Online (Sandbox Code Playgroud)

将文字字符串放在只读内存中,并将字符串复制到堆栈上新分配的内存中.

所以这个数组在内存中分配,它的存在时间取决于声明出现的位置.如果声明在一个函数内,它将一直存在到声明它的块的结尾,并且几乎肯定会在栈上分配; 如果它在函数外部,它可能存储在"初始化数据段"中,该数据段在程序运行时从可执行文件加载到可写存储器中.

制造

strBase[0] = 'x';
Run Code Online (Sandbox Code Playgroud)

法律.