我对使用C在一个字符串中交换两个字符感到困惑。 当我将它设置为数组时,它运行良好:
char strBase[8] = "acbdefg";
在这种情况下,我可以交换任何角色。 但是当我将其设置为字符串时,它会触发总线错误:
char *strBase = "acbdefg";
非常感谢任何人解释或给我一些暗示!
答案 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不匹配的警告。或者,您的编译器可能具有更改常量字符串的只读权限的设置。