准备复习一下C语言,刷一些和面试相关的问题。
-
请填写 bool, float, 指针变量 与 “零值”比较的if语句 A.Bool flag 与 “零值”比较的if语句 1为true 0为false
分析 这里的flag 是布尔类型的变量
标准的写法是 if(flag) 或者 if(!flag)
(If(flag == true)也能实现效果,但是写法赘余,不规范)
B.请写出float x 与 “零值”比较的if语句
标准的写法:
Const float EPSINON = 0.00001;
If((x>=-EPSINON) && x<=EPSINON)
注:不可用将浮点数用==或者!=与数字进行比较,应该转换成>=或<=
(如果你检查是否严格等于0,可以if(x==0.0f),但是由于精度问题,不推荐)
C.请写出char *p与零值比较的if语句
标准答案 if( p == NULL) if(P!=NULL)
这里是判断指针是否指向空
2.以下为Linux下的32为C程序,请计算sizeof的值
Char str[] = “Hello”;
Char *p = str;
Int n =10;
请计算 sizeof(str) sizeof(p) sizeof(n)
标准答案:6: 五个字符+空自符, 4 , 4
Void Func (char str[100]){
....;
}
请计算 sizeof(str) = 4
在C语言中,当你将数组作为函数参数传递时,它会被当作指针来处理。因此,在函数Func内部,sizeof(str)并不会返回整个数组的大小(即100),而是返回指针的大小。
指针的大小是4字节(对于32位系统)或8字节(对于64位系统)。
Void *p = malloc(100);
请计算sizeof(p) = 4
当你使用malloc函数分配内存时,你得到的是一个指向所分配内存块的指针。在C语言中,指针的大小通常不依赖于它所指向的内存块的大小。
3.用变量a 给出下面的定义
e) 一个有10个指针的数组,该指针是指向一个整型数
的; int *a[10] 整数指针的数组
f) 一个指向有10个整型数数组的指针; int (*a)[10] 指向整数数组的指针
g) 一个指向函数的指针,该函数有一个整型参数并返
回一个整型数;
h) 一个有10个指针的数组,该指针指向一个函数,该
函数有一个整型参数并返回一个整型数;
【标准答案】e)int * a[10]; f)int (*a)[10]
g)int (*a)(int); h) int (*a[10])(int)
4.设有以下说明和定义:
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
data 是一个struct, 每个变量分开占用空间. 依次为int4 +
DATE20 + double8 = 32.
所以结果是20 + 32 = 52.
当然... 在某些16位编辑器下, int 可能是2字节,那么结果
是int2 + DATE10 + double8 = 20
5.以下代码的问题
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
问题:
缓冲区溢出:char a; 只分配了一个字符的空间,但是 strcpy(str, "hello"); 试图将五个字符(加上一个空字符 '\0')复制到这块内存。这会导致超出分配的内存范围,覆盖相邻的内存区域。
7.请问以下代码有什么问题:
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么错?
【标准答案】"AAA" 是字符串常量。s是指针,指向这个
字符串常量,所以声明s的时候就有问题。
cosnt char* s="AAA";
然后又因为是常量,所以对是s[0] 的赋值操作是不合法
的。
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;
} 会出现什么问题?
【标准答案】程序崩溃,getmemory中的malloc 不能返回
动态内存,free ()对str操作很危险。