更多课程 选择中心

嵌入式培训
达内IT学院

400-111-8989

嵌入式周末小练|Linux C语言思考题四道

  • 发布:嵌入式培训
  • 来源:嵌入式ARM
  • 时间:2018-05-11 15:09

嵌入式周末小练|Linux C语言思考题

今天是快乐星期五哈,明天就要休息了,但是嵌入式培训班的同学们不能放松,这四道嵌入式周末小练看看,自行核对答案。

嵌入式周末小练|Linux C语言思考题一、

解释main函数参数及其返回值,怎么获取main的返回值,有什么作用?

嵌入式周末小练|Linux C语言思考题二、

printf是怎么实现传参的?然后,它是怎么去找到format格式里面对应的参数的?

嵌入式周末小练|Linux C语言思考题三、

函数调用的堆栈映像是怎样的?

嵌入式周末小练|Linux C语言思考题四、

int fun(){int a=1,b=1, x; x=a+b: return;}有什么结果?如果能够编译的话,会返回数值吗?返回什么数值?

恭喜你已经看完了这四道Linux C语言思考题的题目,我知道你想要继续往下去寻找答案,但是在此之前请你回答我,你是否已经将这四道题目的答案书写了出来?如果是,请继续核对答案:

嵌入式周末小练|Linux C语言思考题一答案:

目前来讲,标准的main应该是

int main(int argc, char **argv /* , char **envp */)

{

return 0;

}

当内核执行C程序时(使用一个exec函数),在调用main函数前先调用一个特殊的启动例程。可执行文件将此启动例程指定为程序的起始位置(这是由连接编辑器设置的,而连接编辑器则由C编辑器调用)

main函数参数

启动例程从内核取得命令行参数和环境变量值,然后按ISO C标准传递参数给main函数

获取main返回值

main的返回值是该进程的返回码,根据该返回码获知该程序是否正常执行,或是否发生异常。

Linux下,执行 echo $? 即可获取main返回值

嵌入式周末小练|Linux C语言思考题二答案:

这个问题的深层问题:怎么实现可变参数列表?

思考问题:堆栈中的参数次序

按参数列表相反的顺序压入到堆栈中,参数列表的第1个参数便位于堆栈中这堆参数的顶部,它距离帧指针的偏移量是一个常数。事实上,任何一个参数距离帧指针的偏移量都是一个常数,这和堆栈中压入多少个参数并无关系。(回答第1个子问题)

然后,printf的第一个参数就是字符串指针,是一个常量(被双引号括起来的那部分),函数通过判断字符串里面的控制参数的个数来判断参数的个数和类型。("%d %d"就表示有两个整形参数)(回答第2个子问题)

下面是模拟一个printf的实现

void

foo(char *fmt, ...)

{

va_list ap;

int d;

char c, *s;

va_start(ap, fmt);

while (*fmt)

switch (*fmt++) {

case 's': /* string */

s = va_arg(ap, char *);

//printf("string %s\n", s);

break;

case 'd': /* int */

d = va_arg(ap, int);

//printf("int %d\n", d);

break;

case 'c': /* char */

/* need a cast here since va_arg only

takes fully promoted types */

c = (char) va_arg(ap, int);

//printf("char %c\n", c);

break;

}

va_end(ap);

}

非常类似

1. 里面一个while把参数列表里面的所有控制参数都“检索”出来,包括参数类型和个数

2. 注释掉的printf可以改变为其他输出函数(假定为系统的sys_printf)

嵌入式周末小练|Linux C语言思考题三答案:

函数调用的堆栈映像是怎样的

被调用函数从堆栈帧指针返回,被调用函数并没有从堆栈中完全清除它的整个堆栈帧:参数还留在那里等待调用函数清除。同样,它的原因和可变参数列表有关。调用函数把参数压到堆栈上,所以只有它才知道堆栈中到底有多少个参数。因此,只有调用函数可以安全地清除它们。

嵌入式周末小练|Linux C语言思考题四答案:

如果,编译器能够通过该程序编译,那么,有可能会返回2;这是编译器把某个寄存器当作“中间结果暂存器”或临时位置,并且函数放回值就放在这个寄存器里面,那么,调用函数就会从这个寄存器中获取被调用函数的返回值。

恭喜你已经核对完了这四道周末小练的答案,不知道这四道Linux C语言思考题你有完全做对吗?还有不理解的地方吗?欢迎来达内嵌入式培训班探讨交流,祝你周末愉快!

免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:透彻了解各种系统调用助你成为嵌入式Linux下编程高手
下一篇:嵌入式培训试题|你能解答这五个Linux常见问题吗?

想要在金九银十找到嵌入式相关的工作?先看这三关你能过吗?

嵌入式系统测试题其实很简单,不信你来做做看!

嵌入式Linux面试题3道,助你过关斩将!

嵌入式面试题二十道,有解析哦!

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省