首页 > c语言程序题

c语言程序题

以下代码输出什么,之前有问过一道关于大端小端模式的题,这道题是那个方向的吗?
跪求解答,做了一天笔试,继续崩溃中。

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文件,也只能空掉眼泪,根本不知道哪里的代码干的。

【热门文章】
【热门文章】