C语言常见问题

1 请填写 bool , float, 指针变量 与“零值”比较的 if语句

//bool类型
if(flag) 
if(!flag)

//float类型
if((x>=-0.000001) && (x<=0.000001))

//指针类型
if(p==NULL)
if(p!=NULL)

2 用变量a给出下面的定义

//1一个有10个指针的数组,该指针是指向一个整型数的;
int *a[10]; //指针数组

//2一个指向有10个整型数数组的指针 ;
int (*a)[10]; //数组指针

//3 一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
int (*a)(int); //函数指针

//4一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数;
int (*a[10])(int); //函数指针数组

 3 设有以下说明和定义:

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));
//的执行结果是: _____

//******************************************
答:DATE是一个union, 变量公用空间. 里面最大的变量
类型是int[5], 占用20个字节. 所以它的大小是20
data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32.
所以结果是 20 + 32 = 52.
当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + doub

4 以下代码有什么问题

int main()
{
    char a;
    char *str=&a;
    strcpy(str,"hello");
    printf(str);
    return 0;
}

没有为str分配内存空间,将会发生异常问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。

5  以下代码有什么问题

char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);

"AAA"是字符串常量。 s是指针,指向这个字符串常量,所以声明s的时候就有问题。cosnt char* s="AAA";然后又因为是常量,所以对是s[0]的赋值操作是不合法的。

6  c和c++中的struct有什么不同?

c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。 c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private

 7 数组和链表的区别?

数组:数据顺序存储,固定大小;
链表:数据可以随机存储,大小可动态改变

 8 以下代码会出现什么问题?打印结果是是多少?

void main()
{
    char aa[10];
    printf(“%d”,strlen(aa));
}

sizeof()和初不初始化,没有关系,strlen()和初始化有关,打印结果值未知。

9 关于struct的字节对齐

struct name1{
   char str;
   int num;
   short x;
};
sizeof(name1) == 12

struct name2{
   char str;
   short x;
   int num;
};
sizeof(name2) == 8

struct name3
{ 
   double dda; 
   char cda; 
   int ida; 
};
sizeof(name3) == 16

1 以struc所占字节最大成员为基准对齐

2 偏移量为struct成员类型的整数倍

10 要对绝对地址0x100000赋值,我们可以用(unsigned int*)0x100000 = 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?

*((void (*)( ))0x100000 ) ( );
首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调用它:
*((void (*)())0x100000)();

11 关键字volatile有什么含意? 并给出三个不同的例子。

        一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
        1). 并行设备的硬件寄存器(如:状态寄存器)
        2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
        3). 多线程应用中被几个任务共享的变量

提示编译器对象的值可能在编译器未监测到的情况下改变。

12 在某工程中,要求设置一绝对地址为0x67a9的整型变量的值为0xaa66。编译器是一个纯粹的ANSI编译器。写代码去完成这一任务。

//典型的类似代码如下:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;

13 const 有什么用途?

(1)可以定义 const 常量
(2) const 可以修饰函数的参数、返回值,甚至函数的定义体。被 const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

14 static有什么用途?

1.限制变量的作用域(static全局变量);
2.设置变量的存储域(static局部变量)。

15 如何引用一个已经定义过的全局变量?

可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变量写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

 16 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

17  位域 :

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义与结构定义相仿,其形式为:

struct 位域结构名

{ 位域列表 };

位域列表的形式为: 类型说明符 位域名:位域长度。

例如:

struct bs
{
    int a:8;
    int b:2; 
    int c:6;
}data;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值