库力索法半导体C++岗笔试题
1.题目
#include<stdio.h> char * GetMemory(void) { char p[] = "hello world"; return p; } int main() { char * str; str = GetMemory(); printf("%s",str); return 0; }
Question: Is the code above correct? if not correct, please modify it.
2.编译结果
编译出现了警告:function returns address of local variable,意思是GetMemory( )函数返回的是局部变量的地址。
警告原因:在函数内部定义的变量是在栈上实现的(也有情况是通过寄存器实现),一旦函数运行结束,变量的存储单元就会被系统回收。GetMemory函数返回栈上的地址,而一旦GetMemory函数运行结束,此地址就会被用作其它用途,所以会出错。
3. 解决方案
#include<stdio.h> char * GetMemory(void) { static char p[] = "hello world"; return p; } int main() { char * str; str = GetMemory(); printf("%s",str); return 0; }
4.解释说明
为什么添加了一个 static 关键字程序就正常运行了?这里我参考jamestaosh的CSDN博客,对C/C++程序内存分配的知识做一次总结和回顾。
- 栈区(stack) – 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
- 堆区(heap) – 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。
- 全局区/静态区(static) – 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量、未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放。
- 文字常量区 – 常量字符串就是放在这里,程序结束后由系统释放。
- 程序代码区 – 存放函数体的二进制代码。
一个正常的程序在内存中通常分为程序段、数据段、堆栈三个部分。程序段里放着程序的机器码、只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则是通过堆栈来存放。
小总结: 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后变量就存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用;在函数体内定义的static表示只在该函数体内有效。函数中的“adgfdf”这样的字符串存放在常量区。
所以,针对这道笔试题的回答应该是:这段程序有问题,因为GetMemory函数返回的是一个本地变量的地址,而这个变量的位置是在栈上,GetMemory函数运行结束后变量便被系统自动回收。这时主程序中便无法打印出相应的字符。添加 static 关键词后,把变量p由局部变量变为静态变量,而静态变量是存储在全局区的,GetMemory函数运行结束后变量p并没有被回收,所以程序运行正确。
今天的文章
库力索法半导体面试_晶方半导体分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/60092.html