使用哈希表实现字典
数据结构的编程作业,使用哈希函数实现字典,并且支持插入,删除,查找功能。没有复杂的算法,但是写的过程中还是遇到一些问题。
1. 段错误
程序定义结构体:
struct hashTableEntry
{
char key[LEN];
char value[LEN];
};
然后在main()函数中定义 struct hashTableEntry hashTable[12255], 出现段错误,开始怀疑是不是C语言对数组所占的内存空间有限制,后来把hashTable变为全局变量,就没有问题。问超哥才知道堆空间和栈空间的区别,开始忏悔编译原理跟OS怎么学的……下面引用C语言教材关于C程序内存映像的介绍:
一个完成编译的C程序取得并使用4块在逻辑上不同且用于不同目的的内存区域。如上图所示,第一块区域存放程序代码,相邻的一块内存区域是存放全局变量和静态变量的静态存储区。相邻两块分别是“堆”和“栈”。栈用于保存程序的许多运行信息,如函数调用的返回地址,函数的形参,局部变量以及CPU的当前状态。堆是一个自由存储区,程序可以使用C的动态内存分配函数来使用它。
C程序中变量的内存分配方式有以下3种:
- 从静态存储区分配。程序的全局变量和静态变量都是在静态存储区上分配,且在程序编译时就已经分配好了,在程序运行期间是存在的。只有在程序终止之前被操作系统回收。
- 在栈上创建。在执行函数调用时,函数内的局部变量及形参都是在栈上创建的,该函数执行结束时,这些内存自动被释放掉。栈内存分配运算置于处理器的指令集中,效率很高,但是容量有限。
- 从堆上分配。在程序运行期间,用动态内存分配函数来申请的内存都是从堆上分配的。动态内存的生存周期由程序员自己来决定,使用非常灵活,但也容易出现问题。有一点需要程序员时刻牢记:自己要负责在不使用这些内存的时候用free()将其释放,归还系统,以便以后利用,这时防止内存泄漏的必要手段。
2. sscanf() 的使用
以前只用过sprintf(),与printf()的使用方法相同,只是将打印的内容保存到字符串中。sscanf()与scnaf()同理,只是从字符串中按格式读取输入,而不是从终端中读取。基本用法见:http://baike.baidu.com/view/1364018.htm
2021年3月21日 19:08
I'm not very good at technology, especially after some change on the settings of email service, it's not easy to follow the old tutorials on the internet, but I luckily found the website hotmail login which is updated regularly to bring the latest step-by-step instruction.