我正在用c编写程序用于vignere密码,当在一个函数中生成密钥作为相同长度的输入名称时,我遇到了一个错误,如果我删除了“printf”行显示输入字符串的长度呢,在sceen上打印奇怪的东西,只有当我从GenKey()函数中删除“printf”行时才会发生。
Supplier
输出(删除该行之前):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *GenKey(char *key, char *source){
int i=0,j=0;
char ReturnKey[strlen(source)];
printf("%d\n",strlen(source)); // THIS LINE HERE CAUSES PROBLEM
for(i=0;i<strlen(source)-1;i++){
if(j==strlen(key)){
j=0;
}
ReturnKey[i]=key[j];
j++;
}
return ReturnKey;
}
int main()
{
int i;
char name[10000];
char container[10000];
char VigKey[]="INFERNO";
char *NamePtr;
char *KeyPtr;
printf("give a name: ");
fgets(name,10000,stdin);
char GeneratedKey[strlen(name)];
KeyPtr=VigKey;
NamePtr=name;
strcpy(GeneratedKey,GenKey(KeyPtr,NamePtr));
printf("%s",GeneratedKey);
}
现在我删除该行
give a name: ATTACKATDAWN
13
INFERNOINFER
输出(删除该行后):
char *GenKey(char *key, char *source){
int i=0,j=0;
char ReturnKey[strlen(source)];
// NOW I HAVE DELETED THAT LINE
for(i=0;i<strlen(source)-1;i++){
if(j==strlen(key)){
j=0;
}
ReturnKey[i]=key[j];
j++;
}
return ReturnKey;
}
答案 0 :(得分:1)
尝试使用malloc在堆上创建ReturnKey字符数组:
char *GenKey(char *key, char *source){
int i=0,j=0;
char *ReturnKey = malloc(sizeof(char) * strlen(source));
for(i=0;i<strlen(source)-1;i++){
if(j==strlen(key)){
j=0;
}
ReturnKey[i]=key[j];
j++;
}
return ReturnKey;
}
在创建ReturnKey之前,您正在将其作为仅存在于该函数上下文中的局部变量。即使你会看到你的单词仍在那里,那只是因为它仍然在内存中的那个位置,但不再被一个对象引用。
当您使用类似malloc的函数创建动态数组时,您将在所谓的&#34;堆&#34;上创建它。当它超出范围时,它不会被释放,这样你就可以从函数中返回它(你实际上在内存中返回指向该位置的指针)。
当使用malloc注意内存未被释放时,因此您必须在某个时候通过免费调用自己释放它,否则您将泄漏内存。
这就是完整代码的样子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *GenKey(char *key, char *source){
int i=0, j=0;
// malloc takes the size of the data type * the length
char *ReturnKey = malloc(sizeof(char) * strlen(source));
for(i=0;i<strlen(source)-1;i++){
if(j==strlen(key)){
j=0;
}
ReturnKey[i]=key[j];
j++;
}
return ReturnKey;
}
int main()
{
int i;
char name[10000];
char container[10000];
char VigKey[]="INFERNO";
char *NamePtr;
char *KeyPtr;
printf("give a name: ");
fgets(name,10000,stdin);
KeyPtr=VigKey;
NamePtr=name;
char *GeneratedKey = GenKey(KeyPtr,NamePtr);
printf("%s",GeneratedKey);
free(GeneratedKey); // IMPORTANT!!!
}
这是一篇关于使用malloc和free的更深入的文章:
https://www.codingunit.com/c-tutorial-the-functions-malloc-and-free