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

时间:2015-02-21 00:18:36

标签: c while-loop malloc free

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

#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] != '\0'; 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启动程序时,我得到文本加密(hallo,1)= ibmmp,这是正确的,但是当我使用文本进行第二次加密时相同的文本和键(不是再次启动程序,但是当while循环开始时第二次加密)我得到encrypt(op�ŀ, 1) = op�ŀ,这显然不是我想要的,但是当我再次运行它时每次都有效。所以第一个looprun工作,第二个失败,第三个,第四个,第五个......再次工作。我认为free()函数存在问题,但我不知道究竟是什么问题。任何人都可以向我解释这种奇怪的行为吗?

2 个答案:

答案 0 :(得分:1)

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

此外,您永远不会存储导致内存泄漏的mallocencrypt&#39; ed)结果。

答案 1 :(得分:0)

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

相关问题