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; ^~~~~~~~~~

我尝试了 staticmalloc 但我不确定堆栈分配是如何工作的。

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 后面是一种非常糟糕的做法。