多个类似的数组的大小可以任意改变,程序怎样写能简化?





sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0‘的字符串作参数。

编译器在编译时就计算出了sizeof的结果。而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。

数组做sizeof的参数不退化,传递给strlen就退化为指针了。

注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就是sizeof。

说明:指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。其保存的数值是个整型数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。

三者主要有以下不同之处:

(1)操作对象不同,strcpy的两个操作对象均为字符串,sprintf的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。

(2)执行效率不同,memcpy最高,strcpy次之,sprintf的效率最低。

(3)实现功能不同,strcpy主要实现字符串变量间的拷贝,sprintf主要实现其他数据类型格式到字符串的转化,memcpy主要是内存块间的拷贝。

说明:strcpy、sprintf与memcpy都可以实现拷贝的功能,但是针对的对象不同,根据实际需求,来选择合适的函数实现拷贝功能。

面试题5-4:数值交换

如果有第三者temp,a和b交换非常方便:

若无temp,可以这样做:

当然,我们可以利用C语言的位运算符:

面试题5-5:编码实现某位清0或置1

给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清a的bit 3,在以上两个操作中,要保持其他位不变。

笔者认为,在对ARM寄存器操作时会经常用到这一块,所以要注意这块:

说明:在置或清变量或寄存器的某一位时,一定要注意不要影响其他位。所以用加减法是很难实现的。

还有一个就是保留某位:

一些人喜欢为设置和清除值而定义一个掩码同时定义一些说明常数,这也是可以接受的。我希望看到几个要点:说明常数、|=和&=~操作。

malloc是系统调用函数还是库函数,而系统调用是怎么进入内核的?

malloc用于用户空间堆扩展的函数接口。该函数是C库,属于封装了相关系统调用(brk())的glibc库函数。而不是系统调用(系统可没有sys_malloc()。

头文件的作用是什么?哪些东西不能放进头文件中?

在C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。而且 .c就是你写的程序文件。

文件头,描述整个文件的文件属性(包括文件是否可执行、是静态链接或动态连接及入口地址、目标硬件、目标操作系统等)
代码段,执行语句编译成的机器代码
数据段,已初始化的全局变量和局部静态变量
BSS 段(Block Started by Symbol),未初始化的全局变量和局部静态变量(因为默认值为 0,所以只是在此预留位置,不占空间)
只读数据段,存放只读数据,一般是程序里面的只读变量(如 const 修饰的变量)和字符串常量
注释信息段,存放编译器版本信息

链接的接口————符号

在链接中,目标文件之间相互拼合实际上是目标文件之间对地址的引用,即对函数和变量的地址的引用。我们将函数和变量统称为符号(Symbol),函数名或变量名就是符号名(Symbol Name)。

Linux 下的共享库就是普通的 ELF 共享对象。

  • x:主版本号,不同主版本号的库之间不兼容,需要重新编译
  • y:次版本号,高版本号向后兼容低版本号
  • z:发布版本号,不对接口进行更改,完全兼容

大部分包括 Linux 在内的开源系统遵循 FHS(File Hierarchy Standard)的标准,这标准规定了系统文件如何存放,包括各个目录结构、组织和作用。

  • /lib:存放系统最关键和最基础的共享库,如动态链接器、C 语言运行库、数学库等
  • /usr/lib:存放非系统运行时所需要的关键性的库,主要是开发库
  • /usr/local/lib:存放跟操作系统本身并不十分相关的库,主要是一些第三方应用程序的库
  • LD_LIBRARY_PATH:临时改变某个应用程序的共享库查找路径,而不会影响其他应用程序
  • LD_PRELOAD:指定预先装载的一些共享库甚至是目标文件
  • LD_DEBUG:打开动态链接器的调试功能

so 共享库的使用(被可执行项目调用)

嵌入可执行文件的启动函数
处理ANSI字符(串)的GUI应用程序
处理Unicode字符(串)的GUI应用程序
处理ANSI字符(串)的CUI应用程序
处理Unicode字符(串)的CUI应用程序

知识点来自《Windows核心编程(第五版)》

  • 有助于解决平台间的差异
  • 创建 DLL,事实上是在创建可供一个可执行模块调用的函数
  • 当一个模块提供一个内存分配函数(malloc、new)的时候,它必须同时提供另一个内存释放函数(free、delete)
  • 一个 DLL 可以导出函数、变量(避免导出)、C++ 类(导出导入需要同编译器,否则避免导出)
  1. PATH 环境变量中所列出的目录

DLL 库的编写(导出一个 DLL 模块)

DLL 库的编写(导出一个 DLL 模块)



DLL 库的使用(运行时动态链接 DLL)

DLL 库的使用(运行时动态链接 DLL)


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


接收更多精彩文章及资源推送,请订阅我的微信公众号:

我要回帖

更多关于 数组的大小可以任意改变 的文章

 

随机推荐