文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>几道C语言面试的解答(一)

几道C语言面试的解答(一)

时间:2010-06-06  来源:compilehacker

几道C语言面试的解答(一) 在我们学校bbs上看到的一个帖子,是关于C语言的几道题,开始觉得这些题有些好像知道怎么回事,却又说不清楚,于是记录下来: 这是BBS上的原帖: 由于公司项目的进展,需要招几个C语言工程师。一连问了五六个问题,居然没答上来一个,以下是我的五个问题:
1. 以下两个定义及初始化有什么区别和联系:
char pch[] = "Hello world";
char *str = "Hello world";
2. static关键字用在哪几种场合,各起什么作用
3. 在典型的系统,比如win32,在调用C的main之前发生了什么事情,另外有时候main函数是有int的返回值,它的返回值做什么用途?
4. C语言程序编译完之后,运行起来,其存储映像包括哪几部分,各起什么作用?
5. C语言传参数的机制是什么,也就是通过什么机制传递参数的?

 
先来看第一个题。 1. 以下两个定义及初始化有什么区别和联系:
char pch[] = "Hello world";
char *str = "Hello world";
  解答: 在《C和指针》中有这样一段话: 尽管char message[] = "Hello";看上去像一个字符串常量,实际上并不是,它只是初始化列表的char message[] = {'H', 'e', 'l', 'l', 'o', 0 };的另一种写法。char *message2 = "Hello";才是一个真正的字符串常量。   于是写了一个程序,并在Linux环境下用gdb测试了一下 #include <stdio.h> int main(int argc, char **argv)
{
 char *message2;
 char message[] = "Hello";
 message2  = "Hello";
 if(argc < 0)
 {
  printf("error\n");
  return 1;
 }
 message[2] = 'r';
 message2[2] = 'r';                    《== 运行到这一行出现段错误
 printf("message : %s\n", message);
 printf("message2: %s\n", message2);
 return 0;
}
  通过gdb调试时,发现message的地址:0xbfe88fd0; message2的地址:0x080484d0。通过下图可知,message位于栈空间内,即属于数组变量。而message2位于只读区,即常量。修改message[2], 是允许的,但修改message2[2],会出现段错误。因为message2属于字符串常量,无法修改。 当然,测试strlen(message)和strlen(message2)的结果均为6,打印他们,均显示hello。   另外,char *message2="hello"相当于const char *message2="hello"。
      其他问题会在后续文章中解决。
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载