最近准备找工作,所以就看了下c。。。
下面分享下一些小的收获。。。
1.我们常会遇到这样的代码:
这个函数分配了一个name结构体的实例,并调整它的而大小,以便将请求的名称置入namestr域里。
另一种则是将namestr[MAX]定义的很长。
这两种做法都不是很符合c标准。
真正安全的做法是使用字符指针,而不是数组。
2.结构体的传递和返回是如何实现的?
当结构体作为函数参数传递的时候,通常会把整个结构都压栈。这样所需要的空间代价就比较大,所以经常传递指针,但是为了保证按值传递的语义,他们可能不得不保留一份局部副本。
3.怎样从/向数据文件读/写结构?
用fwrite来编写一个写结构的程序相对较简单:
fwrite(&somestruct, sizeof(somestruct), 1 ,fp);
对应的fread调用可以再把它读回来。
但是这样的读写有很大的局限,当结构体中含有指针时,将只能读取指针却不能读取指针所指向的内容。
4 sizeof 的返回值的问题。
因为在程序编译的时候编译器会将数据进行对齐,这样方便数据的操作,在32系统中一般为4字节对齐。所以相邻不满4字节的两个数据放在一起,超过则分开。
5 怎样在运行时用名字访问结构体中的域。
创建一个表,保存名称和用offsetof()宏计算出的域偏移量。结构a和b域的偏移量的计算方法如下:
offsetb=offsetof(struct a, b)
如果structp是一个结构体实例指针,而域b是int型,b的值可以这样间接的设置:
*(int *)((char *)structp +offsetb)=value;
6 联合体跟结构体的区别。
联合体本质上是一个成员相互重叠的结构,某一时刻你只能使用一个成员。联合体的大小是它最大成员的大小,而结构体的大小是它所有成员的大小之和。