这是我加密字符串的程序:
#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()函数存在问题,但我不知道究竟是什么问题。任何人都可以向我解释这种奇怪的行为吗?
答案 0 :(得分:1)
free
中对free(dec);
的第一次调用释放了malloc
分配的对象。所有对free
的连续调用都会释放无效对象,因为您可以多次释放dec
指向的同一对象。
此外,您永远不会存储导致内存泄漏的malloc
(encrypt
&#39; ed)结果。
答案 1 :(得分:0)
这是一个悬空指针示例。在您的代码中,您使用malloc
在堆中分配对象并使用指针进行引用。调用free
时,对象被删除但指针仍然指向内存中的该位置。为了在释放对象后避免这些问题,您应该将指针初始化为NULL(dec = NULL
)。所以你第二次看到垃圾,因为指针显示在一个曾经是“哈洛”的地址中。但它已被删除。