c - 在 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;
}
解决方案
这里的问题是result
,作为一个数组,当在表达式中使用时,它会衰减为指向其第一个元素的指针,这就是函数返回的内容。并且因为数组的生命周期在函数返回时结束,所以该指针现在指向一个无效的内存位置,并且尝试使用它会调用未定义的行为。
不用创建本地数组,而是使用该malloc
函数动态分配内存。该内存在程序的生命周期内有效,或者直到返回的指针传递给free
:
string result = malloc(length + 1);
另外,请注意,您需要为用于终止字符串的空字节留出一个额外的字节。
推荐阅读
- windows-10 - 为什么我无法启动我刚刚使用 VitrualBox 构建的虚拟机?
- java - angular5中的错误日期格式
- r - 我是 R 的初学者,我正在尝试求解方程组,但是当我运行时,我在 R 中出现错误
- eclipse - 使用 Eclipse 中的 gradle 插件,如何获得像 maven 这样的项目依赖项?
- highcharts - Highcharts 股票 - 仅规模烛台系列
- apache - 在不使用 ssh 的情况下更改远程目录所有权
- json - 如何使用 AESON 从 Json 文件中提取列表 []
- php - 自制 httpd/php 上的 xdebug 配置在哪里?
- python - 如何使用底图绘制以太平洋为中心的 shapefile?
- javascript - 提供的目标来源与接收窗口的来源不匹配(火箭聊天)