- 评价下面的代码片段:
unsigned int zero = 0;
unsigned int compzero = 0xFFFF;
对于一个int型不是16位的处理器来说,上面的代码是不正确的,应编写为:
unsigned int compzero = ~0;
- C 语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是,它最终结果是什么?
int a = 5,b = 7,c;
c = a+++b;
答:是;c = 12;
- 设有一下说明和定义:
typedef union{long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog; }too;
DATE max;
则语句 printf(“%d”,sizeof(struct date) + sizeof(max)); 的执行结果是?
答:结果是:52(32位编辑器);20(16位编辑器);
在32位编辑器下:DATE是一个union,变量公用空间,里面最大的变量类型是int[5],占用20个字节,所以它的大小是20;data是一个struct,每个变量分开占用空间,依次为int 4 + DATE 20 + double 8 = 32;
结果是:20+32 = 52;
在某些16位编辑器下, int 可能是2字节,那么结果是 int 2 + DATE 10 + double 8 = 20
4.写出下列代码的输出内容
#include <iostream>
int inc(int a)
{
return(++a);
}
int multi(int*a, int*b, int*c)
{
return(*c = *a**b);
}
typedef int(FUNC1)(int in);
typedef int(FUNC2)(int*, int*, int*);
void show(FUNC2 fun, int arg1, int*arg2)
{
int (*p)(int) = &inc;
int temp = p(arg1);
fun(&temp, &arg1, arg2);
printf("%d\n", *arg2);
}
int main()
{
int a;
show(multi, 10, &a);
return 0;
}
5.请找出下面代码中的所有错误
说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
#include "string.h"
int main()
{
char *src = "hello,world";
char *dest = NULL;
int len = strlen(src);
dest = (char*)malloc(len);
char* d = dest;
char* s = src[len];
while (len - != 0)
d++ = s - ;
printf("%s", dest);
return 0;
}
修改后:
#include "string.h"
#include <stdlib.h>
#include <stdio.h>
int main()
{
char str[] = "hello,world";
int len = strlen(str);
char t;
for (int i = 0;i < len/2; i++)
{
t = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = t;
}
printf("%s", str);
return 0;
}
8、请问下面程序有什么错误?
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
答案:把循环语句内外换一下
9.下面的程序输出什么?
#include <iostream>
using namespace std;
int main()
{
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << (str1 == str2) << endl; //false
cout << (str3 == str4) << endl; //false
cout << (str5 == str6) << endl; //true
cout << (str7 == str8) << endl; //true
}
解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;
而 str5,str6,str7,str8是指针,它们指向相同的常量区域。
10.以下代码中的两个sizeof用法有问题吗?
#include <iostream>
using namespace std;
void uppercase(char str[]) //将str中的小写字母转换成大写字母
{
for (size_t i = 0; i < 32; i++)
if ('a' <= str[i] && str[i] <= 'z')
str[i] -= ('a' - 'A');
}
int main()
{
char str[] = "aBcDe";
cout << "str字符长度为:" << sizeof(str)/sizeof(str[0]) << endl;
uppercase(str);
cout << str << endl;
}
答:函数内的 sizeof 有问题。根据语法,sizeof 如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。
sizeof(str)是测出静态定义数组的大小,后面还有\n,所以大小为6;
sizeof(str[0]),str[0]是指向字符串的指针,所以sizeof(str[0]) == sizeof(char) ==1 ;
11.写出输出结果
int main()
{
int a[5] = { 1,2,3,4,5 };
int *ptr = (int *)(&a + 1 );
printf("%d,%d\n", *(a + 1), *(ptr - 1 ));
printf("%p\n", (ptr - 1));
}
&a是整个数组的首地址,而a是数组首元素的首地址。&a是数组指针,其类型为int()[5];而指针+1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加5sizeof(int),
&a+1就是相当于整个数组指针加1,执行&a+1后,ptr的偏移量相当于 a + sizeof(int) 5 1 .
&a+2就是相当于整个数组指针加2,执行&a+2后,ptr的偏移量相当于 a + sizeof(int) 5 2 .
所以p实际是a[5],但是p与(&a + 1)类型是不一样的,这点非常重要,所以p - 1只会减去sizeof(int);a,&a的地址是一样的,但意思就不一样了,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a + 1是下一个对象的地址,即a[5]。所以(ptr - 1)是a[4]的值,而(ptr - 1)是a[4]的地址值。
12.(void )ptr 和 ((void))ptr 的结果是否相同?
答:其中 ptr 为同一个指针,(void )ptr 和 ((void))ptr 值是相同的。
13.下面的语句会出现什么结果?
char szstr[10];
strcpy(szstr,”0123456789″);
答:长度不一样,会造成非法的 OS,应该改为 char szstr[11];
14.函数既然不会被其它函数调用,为什么要返回1?
int main()
{
int x=3;
printf(“%d”,x);
return 1;
}
答:mian 中,c 标准认为0表示成功,非0表示错误。具体的值是某中具体出错信息
15.对绝对地址0×100000赋值且想让程序跳转到绝对地址是0×100000去执行
(unsigned int)0×100000 = 1234;
首先要将0×100000强制转换成函数指针,即:
(void ()())0×100000
然后再调用它:
((void ()())0×100000)();
用 typedef 可以看得更直观些:
typedef void()() voidFuncPtr;
((voidFuncPtr)0×100000)();
16.、输出多少?并分析过程
unsigned short A = 10;
printf(“~A = %u\n”, ~A);
char c=128;
printf(“c=%d\n”,c);
解答:2^32=4294967296,
A=10,为无符号型,转换为二进制为0000 0000 0000 0000 0000 0000 0000 1010
所以~A的二进制位1111 1111 1111 1111 1111 1111 1111 0101即0xFFFFFFF5,如果转换为符号整型的话则为-11,因为输出的是无符号整型,无符号整型的范围为0~4294967295,而0xFFFFFFF5转换为无符号十进制整型为4294967285
第二题,发生溢出,因为有符号字符型其范围为-128~127
127用二进制表示为:0111 1111,128表示为1000 0000,这里发生溢出,因为第一位为1,为符号位,表示负数,即-128
17.找错**
Void test1()
{
char string[10];
char* str1="0123456789";
strcpy(string, str1);// 溢出,应该包括一个存放'\0'的字符 string[11]
}
Void test2()
{
char string[10], str1[10];
for(I=0; I<10;I++)
{
str1[i] ='a';
}
strcpy(string, str1);// I,i 没有声明。
}
Void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)// 改成<10,字符溢出,将 strlen 改为 sizeof 也可以
{
strcpy(string, str1);
}
}