无法使用自己的加密功能对文本进行两次加密

Cannot encrypt text twice with own encrypt function

这是我加密字符串的程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 255
char * encrypt(const char *c, int key){
    char *tmp = malloc(strlen(c)+1);;
    for(int i = 0; c[i] != '[=10=]'; i++){
        tmp[i] = c[i]+key;
    }

    return tmp;
}

int main(void){
    char *dec = malloc(MAX);
    int key;
    int choice;
    do{

        scanf("%d", &choice);
        getchar();
        printf("Geben Sie den zu verschlüsselnden Text ein: ");
                    fgets(dec, MAX, stdin);
                    strtok(dec, "\n");
                    printf("Geben Sie den Schlüssel ein: ");
                    scanf("%d", &key);
                    getchar();
                    printf("encrypt(%s, %d) = %s\n", dec, key, encrypt(dec, key));
                    free(dec);

    }while(choice < 3);

    return EXIT_SUCCESS;
}

当我使用文本 hallo 和密钥 1 启动程序时,我得到文本 encrypt(hallo, 1) = ibmmp,这是正确的,但是当我进行第二次加密时使用相同的文本和密钥(不是再次启动程序,而是在 while 循环开始时进行第二次加密)我得到 encrypt(op�ŀ, 1) = op�ŀ,这显然不是我想要的,但是当我 运行 循环再次工作,每次。所以第一个循环 运行 工作,第二个失败,第三个、第四个、第五个……再次工作。我假设 free() 函数有问题,但我不知道到底是什么问题。任何人都可以向我解释这种奇怪的行为吗?

free(dec); 中对 free 的第一次调用释放了 malloc 分配的对象。当您多次释放 dec 指向的同一个对象时,对 free 的所有连续调用都会释放无效对象。

此外,您永远不会存储 encrypt 的(malloc 编辑)结果,这会导致内存泄漏。

这是一个悬空指针示例。在您的代码中,您使用 malloc 分配堆中的对象并使用指针进行引用。当调用 free 时,对象被删除,但指针仍然指向内存中的那个位置。为了在释放对象后避免这些问题,您应该将指针初始化为 NULL (dec = NULL)。所以你第二次看到垃圾是因为指针显示在一个地址中,该地址曾经是 'hallo' 但它已被删除。