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