我对串(C)中的总线错误感到困惑

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

char strBase[8] = "acbdefg";

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

char *strBase = "acbdefg";

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

这里的区别在于

  char *strBase = "acbdefg"; 

acbdefg放在内存的只读部分并使strBase成为指向该内存的指针,使得对此内存的任何写入操作都是非法的。

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

做的时候:

 char strBase[8] = "acbdefg"; 

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

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

制造

 strBase[0] = 'x'; 

法律。

你的问题是内存分配问题。 您需要空间来存储角色。 你写的时候:

 char strBase[8] = "acbdefg"; 

您创建了自动存储(通常称为堆栈)并使用一串字符对其进行初始化。 但是当你写道:

 char *strBase = "acbdefg"; 

你创建了一个指针并将其指向一个常量字符串。 编译器将其放在标记为只读的内存部分中。 如果您尝试更改它将导致内存访问冲突。

相反,你可以这样做:

 const char* strData = "acbdefg"; int size = 1024; char *strBase = (char*)malloc(size); strncpy(strBase, strData, size); ProcessString(strBase); free(strBase); 

最可能的原因是

 char strBase[8] = "abcdefg"; 

导致编译器为8个字符的数组保留内存,并使用值“abcdefg \ 0”对其进行初始化。 相反,

 char *strBase = "abcdefg"; 

仅保留指针的内存,用字符串的地址初始化。 “abcdefg”是一个常量字符串,因此,编译器将其存储在一个标记为只读的内存区域中。 尝试修改只读内存会导致CPU故障。

您的编译器应该在第二种情况下向您发出有关const不匹配的警告。 或者,您的编译器可能具有更改常量字符串的只读权限的设置。