几道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"。
其他问题会在后续文章中解决。
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"。
其他问题会在后续文章中解决。
相关阅读 更多 +