首页 > 解决方案 > 在 C 中运行用户定义的函数时出现“与局部变量相关的堆栈内存地址”错误

问题描述

最近我一直在参加哈佛大学的 CS50 2020 课程作为 C 编程的介绍。我对这门语言或整个编码不是很有经验,所以我很难弄清楚我的代码有什么问题。

我编写了这个小函数,它应该接收一个字符串,并通过调用另一个函数,使用凯撒密码加密文本,然后将其作为字符串返回。问题是,我不知道如何将字符数组作为字符串返回。在阅读了一些有关该问题的信息后,我尝试在数组末尾添加一个 NUL 字符,并且编译正常,但是当我运行程序时,我收到以下错误消息:

error: address of stack memory associated with local variable 'result' returned [-Werror,-Wreturn-stack-address]
    return result;
           ^~~~~~

我的代码:

string encypher(string text)
{
    int length = strlen(text);
    char result[length];
    for(int i = 0; i < length; i++)
    {
        int letter_c = test_char(text[i]);
        result[i] = (char)letter_c;
    }
    result[length + 1] = '\0';
    return result;
}

标签: carraysclangc-stringscs50

解决方案


这里的问题是result,作为一个数组,当在表达式中使用时,它会衰减为指向其第一个元素的指针,这就是函数返回的内容。并且因为数组的生命周期在函数返回时结束,所以该指针现在指向一个无效的内存位置,并且尝试使用它会调用未定义的行为

不用创建本地数组,而是使用该malloc函数动态分配内存。该内存在程序的生命周期内有效,或者直到返回的指针传递给free

string result = malloc(length + 1);

另外,请注意,您需要为用于终止字符串的空字节留出一个额外的字节。


推荐阅读