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

时间:2014-03-28 03:38:13

标签: c string bus-error

我对使用C在一个字符串中交换两个字符感到困惑。 当我将它设置为数组时,它运行良好:

char strBase[8] = "acbdefg";

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

char *strBase = "acbdefg";

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

3 个答案:

答案 0 :(得分:6)

这里的区别在于

 char *strBase = "acbdefg"; 

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

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

在做的时候:

char strBase[8] = "acbdefg";

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

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

制作

strBase[0] = 'x';

合法的。

答案 1 :(得分:2)

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

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);

答案 2 :(得分:0)

最可能的原因是

char strBase[8] = "abcdefg";

使编译器为八个字符的数组保留内存,并使用值" abcdefg \ 0"初始化它。相比之下,

char *strBase = "abcdefg";

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

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