error: address of stack memory associated with local variable
error: address of stack memory associated with local variable
我有以下功能:
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;
}
不幸的是,当我编译它时 returns 我出现了以下错误:
error: address of stack memory associated with local variable 'ciphertext' returned [-Werror,-Wreturn-stack-address] return ciphertext; ^~~~~~~~~~
我尝试了 static
和 malloc
但我不确定堆栈分配是如何工作的。
C 中的数组是通过引用传递的,您不需要 return 数组只是指向它的指针。
char ciphertext[size];
是一个局部自动变量,当函数 returns 时它不再存在 - 因此对它的任何引用都是无效的。
怎么办?您需要动态分配字符串:
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 后面是一种非常糟糕的做法。
我有以下功能:
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;
}
不幸的是,当我编译它时 returns 我出现了以下错误:
error: address of stack memory associated with local variable 'ciphertext' returned [-Werror,-Wreturn-stack-address] return ciphertext; ^~~~~~~~~~
我尝试了 static
和 malloc
但我不确定堆栈分配是如何工作的。
C 中的数组是通过引用传递的,您不需要 return 数组只是指向它的指针。
char ciphertext[size];
是一个局部自动变量,当函数 returns 时它不再存在 - 因此对它的任何引用都是无效的。
怎么办?您需要动态分配字符串:
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 后面是一种非常糟糕的做法。