嵌入式秋招面经
3.内存管理&编程题(20道)
3.1由gcc编译的C语言程序占用的内存分为哪几个部分?
栈区(stack)
存放函数的参数、局部变量。
堆区(heap)
提供程序员动态申请的内存空间。
全局(静态)区(static)
存放全局变量和静态变量,初始化不为0的全局变量和静态变量、const型常量在一块区域(.data段),未初始化的、初始化为0的全局变量和静态变量在相邻的另一块区域(.bss段)。
程序代码区
存放函数体的二进制代码和字符串常量。
3.2小端:一个数据的低位字节数据存储在低地址
大端:一个数据的高位字节数据存储在低地址
例如:int a=0x12345678; //a首地址为0x200,大端存储格式如下:
如何判读一个系统的大小端存储模式?
(1)方法一:int *强制类型转换为char *,用"[]"解引用
void checkCpuMode(void)
{
int c = 0x12345678;
char *p = (char *)&c;
if(p[0] == 0x12)
printf("Big endian.
");
else if(p[0] == 0x78)
printf("Little endian.
");
else
printf("Uncertain.
");
}
(2)方法二:int *强制类型转换为char *,用"*"解引用
void checkCpuMode(void)
{
int c = 0x12345678;
char *p = (char *)&c;
if(*p == 0x12)
printf("Big endian.
");
else if(*p == 0x78)
printf("Little endian.
");
else
printf("Uncertain.
");
}
(3)方法三:包含short跟char的共用体
void checkCpuMode(void)
{
union Data
{
short a;
char b[sizeof(short)];
}data;
data.a = 0x1234;
if(data.b[0] == 0x12)
printf("Big endian.
");
else if(data.b[0] == 0x34)
printf("Little endian.
");
else
printf("uncertain.
");
}
3.3全局变量和局部变量的区别?
(1)全局变量储存在静态区,进入main函数之前就被创建,生命周期为整个源程序。
(2)局部变量在栈中分配,在函数被调用时才被创建,在函数退出时销毁,生命周期为函数内。
3.4以下程序中,主函数能否成功申请到内存空间?
#include
#include
#include
void getmemory(char *p)
{
p = (char *)malloc(100);
strcpy(p, "hello world");
}
int main()
{
char *str = NULL;
getmemory(str);
printf("%s
", str);
free(str);
return 0;
}
答案:不能。
解读:getmemory(str)没能改变str的值,因为传递给子函数的只是str的复制值NULL,main函数中的str一直都是 NULL。正确的getmemory()如下:
①传递的是二重指针,即str的指针
void getmemory(char **p)
{
*p = (char *)malloc(100);
strcpy(*p, "hello world");
}
②传递的是指针别名,即str的别名,C++中
void getmemory(char * &p)
{
p = (char *)malloc(100);
strcpy(p, "hello world");
}
以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:
https://blog.nowcoder.net/zhuanlan/v0ELPM
嵌入式公司推荐: 华为 、 小米 、 OPPO 、VIVO、 CVTE 、 大疆 、insta360影石、美的 、 TCL 、小米 、经纬恒润 、小鹏、 图森未来 、 百度 、滴滴、蔚来、理想、 联发科、 紫光展锐 、全志、 寒武纪 、晶晨半导体 、汇顶、华为 、 中兴 、浪潮 、TP-LINK、 讯飞、商汤、海康威视 、浙江 大华 、360。qi
3.1由gcc编译的C语言程序占用的内存分为哪几个部分?
栈区(stack)
存放函数的参数、局部变量。
堆区(heap)
提供程序员动态申请的内存空间。
全局(静态)区(static)
存放全局变量和静态变量,初始化不为0的全局变量和静态变量、const型常量在一块区域(.data段),未初始化的、初始化为0的全局变量和静态变量在相邻的另一块区域(.bss段)。
程序代码区
存放函数体的二进制代码和字符串常量。
3.2小端:一个数据的低位字节数据存储在低地址
大端:一个数据的高位字节数据存储在低地址
例如:int a=0x12345678; //a首地址为0x200,大端存储格式如下:
如何判读一个系统的大小端存储模式?
(1)方法一:int *强制类型转换为char *,用"[]"解引用
void checkCpuMode(void)
{
int c = 0x12345678;
char *p = (char *)&c;
if(p[0] == 0x12)
printf("Big endian.
");
else if(p[0] == 0x78)
printf("Little endian.
");
else
printf("Uncertain.
");
}
(2)方法二:int *强制类型转换为char *,用"*"解引用
void checkCpuMode(void)
{
int c = 0x12345678;
char *p = (char *)&c;
if(*p == 0x12)
printf("Big endian.
");
else if(*p == 0x78)
printf("Little endian.
");
else
printf("Uncertain.
");
}
(3)方法三:包含short跟char的共用体
void checkCpuMode(void)
{
union Data
{
short a;
char b[sizeof(short)];
}data;
data.a = 0x1234;
if(data.b[0] == 0x12)
printf("Big endian.
");
else if(data.b[0] == 0x34)
printf("Little endian.
");
else
printf("uncertain.
");
}
3.3全局变量和局部变量的区别?
(1)全局变量储存在静态区,进入main函数之前就被创建,生命周期为整个源程序。
(2)局部变量在栈中分配,在函数被调用时才被创建,在函数退出时销毁,生命周期为函数内。
3.4以下程序中,主函数能否成功申请到内存空间?
#include
#include
#include
void getmemory(char *p)
{
p = (char *)malloc(100);
strcpy(p, "hello world");
}
int main()
{
char *str = NULL;
getmemory(str);
printf("%s
", str);
free(str);
return 0;
}
答案:不能。
解读:getmemory(str)没能改变str的值,因为传递给子函数的只是str的复制值NULL,main函数中的str一直都是 NULL。正确的getmemory()如下:
①传递的是二重指针,即str的指针
void getmemory(char **p)
{
*p = (char *)malloc(100);
strcpy(*p, "hello world");
}
②传递的是指针别名,即str的别名,C++中
void getmemory(char * &p)
{
p = (char *)malloc(100);
strcpy(p, "hello world");
}
以上内容摘自专刊《嵌入式岗位笔试面试真题讲解》,该专刊不仅有真题讲解,还有经验分享,不清楚嵌入式该学什么的同学,想找嵌入式实习/正式工作的同学,都可以来看看:
https://blog.nowcoder.net/zhuanlan/v0ELPM
嵌入式公司推荐: 华为 、 小米 、 OPPO 、VIVO、 CVTE 、 大疆 、insta360影石、美的 、 TCL 、小米 、经纬恒润 、小鹏、 图森未来 、 百度 、滴滴、蔚来、理想、 联发科、 紫光展锐 、全志、 寒武纪 、晶晨半导体 、汇顶、华为 、 中兴 、浪潮 、TP-LINK、 讯飞、商汤、海康威视 、浙江 大华 、360。qi
全部评论
相关推荐
11-06 20:09
门头沟学院 Java 点赞 评论 收藏
分享