题目原帖地址: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