URN Logo
UNIX Resources » Linux » China Linux Forum » CPU 与 编译器 » 3 » 请教一下这道题是不是考编译原理的
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
请教一下这道题是不是考编译原理的
请教一下这道题是不是考编译原理的 - ZWZH [2006-10-29 10:59 | 294 byte(s)]
 
 
 
 
 
 
 
 
Subject: 请教一下这道题是不是考编译原理的
Author: ZWZH    Posted: 2006-10-29 10:59    Length: 294 byte(s)
[Original] [Print] [Top]
以下程序能否正常输出:"hello world",请说明理由。
char *GetMemory()
{
p=char* malloc(100);
}
void main()
{
char* str;
str=GetMemory();
strcpy(str,"hello world");
printf(str);
}
[Original] [Print] [Top]
Subject: Re: 请教一下这道题是不是考编译原理的
Author: EricFisher    Posted: 2006-10-29 13:04    Length: 743 byte(s)
[Original] [Print] [Top]
关于动态分配和作用域的?

str的内存空间是动态分配的,存放在堆中(heap),而不是函数的栈中(stack),自然不受作用
域的限制,如下程序可以输出"hello world"。

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

char *GetMemory()
{
char *p;
p=(char *)malloc(100);
return p;
}
int main(void)
{
char *str;
str=GetMemory();
strcpy(str,"hello world");
printf(str);
return 0;
}

[Original] [Print] [Top]
Subject: Re: 请教一下这道题是不是考编译原理的
Author: canopy    Posted: 2006-10-29 14:08    Length: 474 byte(s)
[Original] [Print] [Top]
在C/C++编程版你不是问过了吗?

http://www.linuxforum.net/forum/showflat.php?Cat=&Board=program&Number=631090&page=0&view=collapsed&sb=5&o=7&fpart=

[Original] [Print] [Top]
Subject: Re: 请教一下这道题是不是考编译原理的
Author: ZWZH    Posted: 2006-10-29 16:41    Length: 84 byte(s)
[Original] [Print] [Top]
这是一道考试题,我不知道它想考什么,我没学过编译原理,想问问是不是编译中讨论的问题。
[Original] [Print] [Top]
Subject: Re: 请教一下这道题是不是考编译原理的
Author: canopy    Posted: 2006-10-29 19:05    Length: 60 byte(s)
[Original] [Print] [Top]
为什么不当面问考官? 同样的题目,不同的考官想考的可能都不一样.
[Original] [Print] [Top]
Subject: Re: 请教一下这道题是不是考编译原理的
Author: ZWZH    Posted: 2006-10-29 19:54    Length: 108 byte(s)
[Original] [Print] [Top]
是06年中科院计算所的软件基础考题,因为试题不公开,这是从网上找的回忆版,不知道是书局结构部分的还是编译部分的
[Original] [Print] [Top]
Subject: Re: 请教一下这道题是不是考编译原理的
Author: mingyanguo    Posted: 2006-10-31 14:36    Length: 290 byte(s)
[Original] [Print] [Top]
char *GetMemory()
{
p=char* malloc(100);
}
没有return
在IA32上,如果编译能通过的话,应该可以输出。malloc的结果将放到%eax,接下来%eax的寄存器不太可能被冲掉,所以返回时与有return应该结果相同。但是这个有没有破坏%eax是不太确定的,窃以为这道题不好。
[Original] [Print] [Top]
Subject: Re: 请教一下这道题是不是考编译原理的
Author: yjx_super    Posted: 2006-10-31 17:34    Length: 872 byte(s)
[Original] [Print] [Top]
是考编译原理的。题目的意思是:
1. 如果函数有返回值,那么当返回值的长度可以使用寄存器容纳时,编译器会把返回值放入寄存器
2. 此处函数返回一个char *指针,编译器会使用寄存器返回
3. 对于常见的Intel机器,如果使用一个寄存器就可以返回,那么编译器使用eax返回
4. 但是此处没有返回语句,那么最终GetMemory返回的就是eax的值(不管它是什么)
5. 如果编译器为GetMemory生成代码,那么应该为:
pushl ebp
movl esp, ebp
subl $num, esp //为临时变量留出堆栈空间
movl 0x64, esp+n
call malloc //调用过后,malloc的返回值已经放入eax
movl eax, p
ret
6. 所以此时的eas还是malloc的返回值,故执行str = GetMemory时,GetMemory会把这个eax给str
7. 因为str确实指向malloc分配的空间,故此程序能输出hello world
----
Out of your Window!
[Original] [Print] [Top]
« Previous thread
IBM PPC和MPC有哪些不同?
CPU 与 编译器
3
Next thread »
用什么样数据结构描述ABI比较合适
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:47:11, cost 0.062265872955322 ms.