错误:与局部变量关联的堆栈内存地址

问题描述 投票:0回答:1

我有以下功能:

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 variables char stack cs50
1个回答
3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.