1、请填写bool , float, 指针变量 与“零值”比较的if
语句。
提示:这里“零值”可以是0, 0.0 , FALSE 或者“空指针”
。例如int 变量n 与“零值”比较的if 语句为:
if ( n == 0 )
if ( n != 0 )
以此类推。
(1)请写出bool flag 与“零值”比较的if 语句:
【标准答案】if ( flag ) if ( !flag )
(2)请写出float x 与“零值”比较的if 语句:
【标准答案】 const float EPSINON = 0.00000001;
float的精确到小数位后8,其中符号位占一位,指数位占8位,小数位占23位,共32位,2^23=8388608
if ((x >= - EPSINON) && (x <= EPSINON)
不可将浮点变量用“==” 或“!=” 与数字比较,应该设法
转化成“>=” 或“<=” 此类形式。
(3)请写出char *p 与“零值”比较的if 语句
【标准答案】 if (p == NULL) if (p != NULL)
2、以下为Linux下的32 位C 程序,请计算sizeof 的
值。
char str[] = “Hello” ;
char *p = str ;
i nt n = 10;
请计算
(1)sizeof (str ) = (2)s i zeof ( p ) =
(3)sizeof ( n ) =
【标准答案】
(1)6、(2)4 、(3 )4
(4)void Func ( char str[100])
{
…… ;
}
请计算sizeof( str ) =
(5)void * p = mall oc( 100 );
请计算sizeof ( p ) =
【标准答案】(4)其实算一个指针:4 (5)4
4、用变量a 给出下面的定义
e) 一个有10个指针的数组,该指针是指向一个整型数
的;
f) 一个指向有10个整型数数组的指针;
g) 一个指向函数的指针,该函数有一个整型参数并返
回一个整型数;
h) 一个有10个指针的数组,该指针指向一个函数,该
函数有一个整型参数并返回一个整型数;
【标准答案】e)int * a[10]; f)int (*a)[10]
g)int (*a)(int); h) int (*a[10])(int)
5、设有以下说明和定义:
typedef u nion {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)); 的
执行结果是:_
【标准答案】DATE是一个union, 变量公用空间. 里面最
大的变量类型是int[5], 占用20个字节. 所以它的大小是
20
union数据类型的大小计算方法是: 联合体中占用内存空间最大的字段加上填充字节后的和是联合体中占用内存空间最大的字段的整数倍。(max+n) / x 的结果是一个整数,result = max+n。
max 是union中占用内存空间最大的字段占用的内存大小,大于等于1的整数。
n 是填充字节,非负整数。
x 是union中占用内存空间最大的一个基本数据类型占用的内存空间大小,大于等于1的整数。
result 是union数据类型实际上在内存中占用的内存大小,大于等于1。
举例:
union a
{
char a;
int b;
char c[10];
};
这个联合体占用12个字节的内存空间。根据上面的计算公式计算是:(10+2)/4。
data 是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.
偏移量要是该变量所占字节的整数倍,否则要补足到整数倍。
如:
struct struct_data{
int a ;//int本身占用4个字节,偏移量为0
char b ;//char本身占用1个字节,偏移量为4
int c ;//1.暂时偏移量为5,编译器会判断出5不是4的整数倍,会在b的后面填充3个字节,最后c的偏移量为8,使得c的偏移量为c本身大小的整数倍;2.现在整个结构体大小暂时为12,编译器会判断12是不是其最大成员的整数倍,会在c末尾填充为整数倍,最后得出结果为12
};
所以结果是20 + 32 = 52.
当然… 在某些16位编辑器下, int 可能是2字节,那么结果
是int2 + DATE10 + double8 = 20
6、请问以下代码有什么问题:
int main()
{
char a;
char *str=&a;
strcpy(str,”hello”);
printf(str);
return 0;
}
【标准答案】没有为str分配内存空间,将会发生异常
问题出在将一个字符串复制进一个字符变量指针所指
地址。虽然可以正确输出结果,但因为越界进行内在
读写而导致程序崩溃。
7、请问以下代码有什么问题:
char* s=”AAA”;
printf(“%s”,s);
s[0]=’B’;
printf(“%s”,s);
有什么错?
【标准答案】char* s=”AAA”; //s是一般的指针,但是存放的是字符串常量首地址printf(“%s”,s); s[0]=’B’;//编译正确,运行出错,因为s[0]=’B’试图修改字符串常量,字符串常量不能修改,一般情况下给字符串常量赋值推荐做法是:const char* s=”AAA”;这样当编译器发现修改字符串常量内容时,就会直接报错。
8、int (*s[10])(int) 表示的是什么啊
【标准答案】int (*s[10])(int) 函数指针数组,每个指针
指向一个int func(intp aram) 的函数。数组包含十个指针。
9、c和c++ 中的struct有什么不同?
【标准答案】c和c++ 中struct的主要区别是c中的struct
不可以含有成员函数,而c++ 中的struct可以。c++ 中
struct和class的主要区别在于默认的存取权限不同,
struct默认为public ,而class默认为private
10、void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,“hello world”);
}
int main( )
{
char *str=NULL;
getmemory(str);
printf(“%s/n”,str);
free(str);
return 0;
} 会出现什么问题?
【标准答案】程序崩溃,指针str与形参指针p不是同一个地址,所以,free ()对str操作则是释放一个空的指针,会出错。
11、char szstr[10];
strcpy(szstr,”0123456789”);
产生什么结果?为什么?
【标准答案】长度不一样,出现段错误。
100 条经典 C语言笔试题目
12、数组和链表的区别?
【标准答案】数组:数据顺序存储,固定大小;
链表:数据可以随机存储,大小可动态改变
13、void main()
{
char aa[10];
printf(“%d”,strlen(aa));
}
会出现什么问题?打印结果是是多少?
【标准答案】sizeof()和初不初始化,没有关系,
strlen()和初始化有关,打印结果值未知。
14、给定结构struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}; 问sizeof(A) = ?
【标准答案】8
15、struct name1{
char str;
short x;
int num;
} ;求sizeof(name1)?
【标准答案】8
16、struct name2{
char str;
int num;
short x;
}; 求sizeof(name2)?
【标准答案】12
17、程序哪里有错误
wap( int* p1,int* p2 )
{
int * p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
【标准答案】p 为野指针
19、(void )ptr 和((void**))ptr 的结果是否相同?其
中ptr为同一个指针。
【标准答案】(void )ptr 和((void**))ptr 值是相同的
20、要对绝对地址0x100000赋值,我们可以用
(unsigned int*)0x100000 = 1234;
那么要是想让程序跳转到绝对地址是0x100000去执行
,应该怎么做?
【标准答案】((void ()( ))0x100000 ) ( );
首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调用它:
((void ()())0x100000)();