1.32位机上根据下面的代码,问哪些说法是正确的?
signed char a = 0xe0;
unsigned int b = a;
unsigned char c = a;
正确答案: C
A. a>0 && c>0 为真
B. a == c 为真
C. b 的十六进制表示是:0xffffffe0
D. 上面都不对
解析:
1. 扩展问题
符号位扩展:有符号数向其它类型数据转化(如char到int,char到unsignedint);
零扩展:无符号数向其它类型转换(如unsigned char到int,long)。
2. 整形提升
在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。
所以对于:a == c,二者都会提升为int,然后再比较。
a -> 0xffffffe0.
c -> 0x000000ex.
2 在linux下64位c程序,请计算输出的三个sizeof分别是()
void func(char str_arg[100]) { cout<<sizeof(str_arg)<<endl; } int main(int argc,char* argv[]) { char str[]="Hello"; char *p=str; cout<<sizeof(str)<<endl; cout<<sizeof(p)<<endl; func("test"); return 0; } |
正确答案: D
A. 5,5,8
B. 6,6,4
C. 6,8,4
D. 6,8,8
解析:
sizeof(str)测量的是字符数组的占用长度,注意字符串后还有个\0,所以是6
sizeof(p)测量的是指针的占用长度,64位系统下是8字节
sizeof(str_arg)测量的是指针长度,因为这里是形参。
3 以下代码段有问题的是()
正确答案: A B C
A. <pre>void func1(char *e){
char *p1;
p1=malloc(100);
sprintf(p1,error:"%s'.",e);
local_log(p1);
}
</pre>
B. <pre>
int func2(char *filename)
{
FILE *fp;
int key;
fp=fopen(filename,"r");
fscanf(fp,"%d",&key);
return key;
}
</pre>
C. <pre>
void func3(char *info){
char *p,*pp;
p=malloc(100);
pp=p;
free(p);
sprintf(pp,*info:"%s'.",info);
free(pp);
}
</pre>
D. 选项全部都不正确
解析:
A申请了空间没有释放,
Bfp=fopen();打开流没有关闭,
Cfree了二次,但其实,pp=p;两个指针都指向同一块内存空间。只需释放一次就够了。