一如既往,指针存在问题。我正在尝试为char数组创建一个非常简单的“加密/解密”函数。是的,我知道我可以使用字符串,但我想提高我对指针的了解并利用简单的字节来完成一个简单的任务。 所以,我创建了一个这样的简单结构:
struct text {
char* value;
int size;
}
我创造了这个简单的功能:
text encrypt(text decrypted) {
char key = 'X';
for (int i=0; i<decrypted.size; i++) {
decrypted.value[i] = decrypted.value[i] ^ (key + i) % 255);
}
return decrypted;
}
此时,一位经验丰富的C ++程序员应该发现问题,我想。无论如何,我把这个函数称为:
...
text mytext;
mytext.value = new char[5];
mytext.value = "Hello";
mytext.size = 5;
mytext = encrypt(mytext);
...
我像往常一样得到了“分段错误(核心转储)”错误。这是Linux,当然还有g ++。我又做了什么?谢谢!
答案 0 :(得分:3)
mytext.value = new char[5];
mytext.value = "Hello";
在第二行,你丢弃(处理)分配的内存,泄漏它,让mytext.value
指向一个字符串文字。修改字符串文字是未定义的行为,并且通常会崩溃,因为字符串文字通常存储在只读内存段中。
如果你坚持使用char*
,你应该strncpy
将字符串放入已分配的内存中(但要注意它不会以0结尾),你最好分配一个new char[6]
1}}并复制0终结符。
或者让decrypt
创建一个它返回的新text
:
text encrypt(text decrypted) {
char key = 'X';
text encrypted;
encrypted.size = decrypted.size;
encrypted.value = new char[encrypted.size];
for (int i=0; i<decrypted.size; i++) {
encrypted.value[i] = decrypted.value[i] ^ (key + i) % 255;
}
// What about 0-terminators?
return encrypted;
}
但是,当您使用C ++时,std::string
将是更好的选择。
答案 1 :(得分:3)
您正在修改字符串文字:
mytext.value = "Hello";
在此之后,你不能再合法地改变mytext.value
指向的内容,你只能重新分配指针。
修复:使用std::string