我一直在研究C和一些加密技术,无论如何,我尝试动态分配一个字符串以输入纯文本和一个用于获取密文的密钥。程序可以工作,直到我决定释放分配的内存。然后产生一个错误,指出:HEAP CORRUPTION DETECTED:在此地址和此地址的Normal块(#73)之后;检查了所有其他帖子,没什么,我很困惑,请帮助。这是代码:
int main(int argc, char *argv[])
{
int plainSize = 0;
int keySize = 0;
InputInteger(keySize,"key size");
InputInteger(plainSize,"plaintext size");
char *plaintext = (char*)malloc((plainSize + 1) * sizeof(char));
char *key = (char*)malloc((keySize + 1) * sizeof(char));
char *cypher = (char*)malloc((plainSize + 1) * sizeof(char));
InputString(plaintext, "plaintext");
InputString(key, "key");
cypher=ViginereEncrypt(plaintext, key);
printf("\n%s encypted with Viginere key %s is %s", plaintext, key, cypher);
printf("\n\n");
free(plaintext);
free(key);
free(cypher);
}
char *ViginereEncrypt(char *plaintext,char *key)
{
int i = 0;
char *cypherText = (char*)malloc((strlen(plaintext) + 1)*sizeof(char));
printf("\n%d\n", strlen(plaintext) + 1);
for (i = 0;i < strlen(plaintext);i++)
*cypherText++ =(*plaintext++ - 'A' + *key++ - 'A' -1) % ('Z' - 'A') + 'A';
cypherText[i] = '\0';
return cypherText;
}
void InputInteger(int myInteger,char name [100])
{
printf("Input a number for %s : ",name);
scanf("%d", &myInteger);
}
void InputString(char myString[],char name[100])
{
printf("Input a string for %s : ",name);
scanf("%s", myString);
}
函数内部的分配是否有问题?认为这不应该是因为我将密码“复制”到了函数返回然后释放了它。提前致谢!
最佳答案
函数调用InputInteger(keySize,"key size");
不能将值赋给keySize
。 keySize
和plainSize
都将保留为0
。因此,您为每个字符串分配1个字节的内存,仅够一个终结符。计算机融化。
我建议这些更改,首先要传回输入值
void InputInteger(int *myInteger, char name [100]) // add the *
{
printf("Input a number for %s : ", name);
scanf("%d", myInteger); // remove the &
}
然后更改您的调用方式。
InputInteger(&keySize, "key size"); // add the &
InputInteger(&plainSize, "plaintext size"); // add the &
这样就可以传递要更改的变量的地址。
编辑:这并不是说代码中没有其他易爆物品。字符串长度可能是负数,您应该进行一些输入验证。此外,
InputString
函数还可以接受恶意攻击或意外错误,用户可以说字符串长度为2,然后破坏堆栈,其中一些奇怪的较大输入会接管机器,因为这是perp拥有的可执行代码放在那里偷豆子。关于c - 检测到堆腐败C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38677120/