我对串(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不匹配的警告。 或者,您的编译器可能具有更改常量字符串的只读权限的设置。