您的位置:首页 > 编程语言 > C语言/C++

绝对能够测试你的C语言功力的几个问题 - 参考答案

2012-04-20 13:36 363 查看

绝对能够测试你的C语言功力的几个问题 - 参考答案

题目原帖地址:http://chimf.bloghome.cn/posts/52793.html

没有提供答案,我写了个参考答案,希望各位批评指正!



参考答案:
int x = 35;

char str[10];

//问:strlen(str)和sizeof(str)的值分别是多少?

//参考答案:13, 10.(在x86机器中 -- Little Endian、递减栈、VC6.0编译器)

//首先在栈中给x分配空间,由于是Little Endian,并且栈是递减的,x在内存中从高到低依次为:00 00 00 23

//然后在栈中给str分配空间,由于VC6.0编译器中栈默认是4字节对齐,因此实际上会在栈上会分出12字节空间,str指向最低地址

//因此,内存中的从低到高为:CC CC CC CC CC CC CC CC CC CC CC CC 23 00 00 00,strlen(str) = 13

//P.S. gcc貌似栈是16字节对齐的,因此结果应该不同,有个公司的笔试题就是这个,个人感觉这种编译器相关的结果没啥意思



strcpy(str, "http://www.it315.org" /*共13个字母*/);

//问:此时x和strlen(str)的值分别是多少?

//参考答案:x=103, strlen(str)=13. 根据上面的分析,这题就简单了,x = 'g' = 0x67 = 103



str = "it315.org";

//问:编译能通过吗?

//参考答案:不能,char str[10]; ==> char * const str; 指针常量不能被重新赋值



char * pstr;

strcpy(pstr, "http://www.it315.org/");

//问:上句编译能通过吗?运行时有问题吗?

//参考答案:能编译过,但运行时会有问题,因为没有给pstr分配内存空间



const char * p1;

char * const p2;

//问:上面两句有什么区别吗?

//参考答案:p1是一个指向常量的指针,即p1++合法,*p1='a'非法;p2指针本身就是一个常量,即*p2='a'合法,p2++非法,并且p2在定义时必须初始化,如char * const p2 = str;

p1 = (const char *)str;

//问:如果是p1=str; 编译能够通过吗?明白为什么要类型转换?类型转换的本质是什么?

//参考答案:不能,因为str是一个char * const,而p1是一个const char *



strcpy(p1, "abc");

//问:编译能够通过吗?

//参考答案:不能,p1是一个const char *,不能改变其指向的值,而strcpy的参数要求是一个char *



printf("%d", str);

//问:有问题吗?

//参考答案:没问题,输出的结果是str指针的值,即一个地址值(10进制)



pstr = 3000;

//问:编译能过吗?如果不行,该如何修改以保证编译通过呢?

//参考答案:不能,pstr = (char *)3000;可以通过编译



long y = (long)pstr;

//问:可以这样做吗?

//参考答案:可以,y就是pstr指针的值,即一个地址

int *p = (int *)str;

*p = 0x00313200;

printf("%s", str);

//问:会是什么效果?提示0x31对应字符'1',0x32对应字符'2'。

//参考答案:什么也不输出,str的内存布局为:00 32 31 00 ...



p = (int *)3000;

//问:p+1的结果会是多少?

//参考答案:p+1 = p+sizeof(int) = 3004



char *pc = new char[100];

//问:上述语句在内存中占据几个内存块,怎样的布局情况?

//参考答案:104个,pc占4个字节,在栈上,堆上分配了100个字节



void test(char **p)

{

*p=new char[100];

}

//问:这个编译函数有问题吗?外面要调用这个函数,该怎样传递参数?

//参考答案:没有问题,char * pStr; test(&pStr);

//问:能明白typedef int (*PFUN)(int x,int y)及其作用吗?

//参考答案:定义一个函数指针类型,有两个int型参数,返回值为int
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: