以下代码输出什么,之前有问过一道关于大端小端模式的题,这道题是那个方向的吗?
跪求解答,做了一天笔试,继续崩溃中。
int main(int argc, char *argv[])
{
unsigned int a=0xfffffff7;
unsigned char i=(unsigned char)a;
char *b=(char *)&a;
printf("%08x,%08x\n",i,*b);
return 0;
}
顺便再加一道题,今天笔试的一道选择题,如下代码是否有错误,如何改正?
void get_strlen(char *str,int *len)
{
*len=sizeof(str);
}
char s[]="hello world";
int main(int argc, char *argv[])
{
short len=0;
get_strlen(s,&len);
return 0;
}
………………………………………………………分割线………………………………………
第二题在xcode下直接提示错误,无法运行。当然程序的本意是要返回字符串所占空间,在传参时退化为指针。我在做这道题的时候没注意到short,不知道在其他编译器下是否能运行?
第一个题参考这里
第二个题目,有两个错误。
第一,sizeof(str)永远返回4。我们都知道
char* str="xx";sizeof(str);
和char[] str="xx";sizeof(str);
这两种的区别。 前者是求指针类型的大小,后者是求数组的总大小。但是要注意一点,数组在函数调用的时候会发生退化,也就是说,在被调用处,已经纯粹是个指针了。这是因为sizeof是编译阶段就处理的,数组是运行阶段才去在栈上申请的,编译器不知道你这是什么鬼,只能当指针处理。
第二,用short去定义的len,却在被调用处用int去复制,这是严重的踩内存。之前在华为,就是一模一样的问题,我跟我师父搞了2个通宵才找到的。这直接会踩掉栈上的其他内存,比如入参可能是一个处理队列,这个队列被踩了不知道,等到下次再被处理出错时,已经猴年马月了。你拿着core文件,也只能空掉眼泪,根本不知道哪里的代码干的。