我有以下功能:
string encipher(string plaintext, string key) {
int size = strlen(plaintext);
char ciphertext[size];
// For each alphabetic characters determine what letter it map to
for (int i = 0; i < size; i++) {
for(int j = 0; k[j] != plaintext[i]; j++) {
ciphertext[i] = key[j];
}
}
return ciphertext;
}
不幸的是,当我编译时,它返回以下错误:
错误:与局部变量“密文”关联的堆栈内存地址返回[-Werror,-Wreturn-stack-address]返回密文; ^~~~~~~~~~
我尝试了
static
和malloc
,但我不确定堆栈分配是如何工作的。
C 中的数组是通过引用传递的,并且您不会仅返回指向它的数组指针。
char ciphertext[size];
是一个局部自动变量,当函数返回时它不再存在 - 因此对它的任何引用都是无效的。
该怎么办?您需要动态分配字符串:
string encipher(string plaintext, string key)
{
int size = strlen(plaintext);
char *ciphertext = malloc(size);
// check for allocation errors
// remember to free this memory when not needed
// For each alphabetic characters determine what letter it map to
for(int i = 0; i < size; i++ )
{
for(int j = 0; k[j] != plaintext[i]; j++)
{
ciphertext[i] = key[j];
}
}
return ciphertext;
}
或者缓冲区应该由调用者分配
string encipher(char *ciphertext, string plaintext, string key)
{
int size = strlen(plaintext);
// For each alphabetic charaters determine what letter it map to
for(int i = 0; i < size; i++ )
{
for(int j = 0; k[j] != plaintext[i]; j++)
{
ciphertext[i] = key[j];
}
}
return ciphertext;
}
顺便说一句,将指针隐藏在 typedef 后面是一种非常糟糕的做法。