这是家庭作业的一部分。
我试图在我的方法getLine中读取并返回一行文件。
char *getLine(FILE *input) { char line[30]; if(fgets(line, sizeof(line), input)!=NULL) { return line; }else{ return NULL; } }
这似乎与我所教的关于指针的工作有关,但是我无法删除警告消息warning: function returns address of local variable [enabled by default]
。 该警告是指线路return line;
。 我的作业要求编译时没有警告或错误。 我不明白我做错了什么。
我发现的大多数帮助建议为文本行提供malloc-ing空间,但是我们还没有在课堂上讨论过这个问题,即使我已经在另一个类中完成了一些操作。 这真的是最好的方法吗? 如果是这样,我可以在该计划的任何地方免费吗?
char line[30];
是具有自动存储持续时间的数组。 一旦执行超出函数范围,它所驻留的内存就会被释放,因此返回的指向该内存的指针变为无效(悬空指针)。
尝试访问已经解除分配的内存会导致未定义的行为 。
您可以动态分配数组并让调用者显式释放它:
char *getLine() { char* line = malloc(30); ... return line; } // somewhere: char* line = getLine(); ... free(line);
不使用malloc的替代方案,据我所知,早期的问题没有涵盖:
/* Warning, this function is not re-entrant. It overwrites result of previous call */ char *getLine(FILE *input) { static char line[30]; return fgets(line, sizeof(line), input); /* fgets returns NULL on failure, line on success, no need to test it */ }
说明: 函数作用域中的 静态变量即使在函数返回后仍保留其值。 只有这样一个变量的一个实例,每次调用该函数时都使用相同的一个(因此不能重入/线程安全)。 程序启动时会分配静态变量的内存,既不是堆也不是堆栈,而是在运行程序的内存空间中它自己的保留区域。 在第一次使用之前,静态变量的值只被初始化一次(上面没有特定的初始化,所以它用0填充,但它也可以有一个初始化器,并且只有在第一次调用函数时才是它的值)。
虽然以这种方式使用静态变量可能看起来有点hacky(我同意它),但它仍然是标准C使用的有效模式,例如strtok()
函数 。 它还certificate了对可重入版本的需求,因为C标准也有strtok_r()
,因为它有一个额外的参数而不是在其中有本地静态变量,因此使用起来更复杂。
以上就是c/c++开发分享C返回char 警告“返回局部变量的地址”相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562414.html