无法使用自己的加密功能对文本进行两次加密
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' 但它已被删除。
这是我加密字符串的程序:
#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' 但它已被删除。