0

与往常一样,指针有问题。我正在尝试为 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++。我又做了什么?谢谢!

4

2 回答 2

3
mytext.value = new char[5];
mytext.value = "Hello";

在第二行,你扔掉(句柄)分配的内存,泄漏它,并让mytext.value指向一个字符串文字。修改字符串文字是未定义的行为,并且通常会崩溃,因为字符串文字通常存储在只读内存段中。

如果您坚持使用 a char*,则应strncpy将字符串放入分配的内存中(但请注意,那时它不会以 0 结尾,您最好分配 anew char[6]并复制 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这里将是一个更好的选择。

于 2012-12-13T16:47:45.777 回答
3

您正在修改字符串文字:

mytext.value = "Hello";

在此之后,您不能再合法地改变mytext.value指向的内容,您只能重新分配指针。

修复:使用std::string

于 2012-12-13T16:47:55.183 回答