Chinaunix首页 | 论坛 | 博客
  • 博客访问: 162072
  • 博文数量: 63
  • 博客积分: 2961
  • 博客等级: 少校
  • 技术积分: 445
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-21 10:44
文章分类

全部博文(63)

文章存档

2011年(17)

2010年(46)

我的朋友

分类: C/C++

2010-06-06 12:21:08

几道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
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"。
 
 
 
其他问题会在后续文章中解决。
阅读(833) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~