1、为了保存可变数量的数据,可以使用链表。
2、链表是一种抽象数据类型,可以保存各种不同类型的数据。
3、递归结构要有名字,C语言不允许使用typedef来声明它。
4、给出一个指向其他结构的指针,能不能把指针换成一个递归定义的结构:C语言需要知道结构在存储器中占的具体大小,如果在结构中递归地复制它自己,那么两条数据就会不一样打。
5、栈用来保存局部变量,为了进行动态存储,需要使用堆。可以将堆看作一个储物柜。
6、堆:使用malloc()函数(memory allocaation存储器分配),他会返回一个指针。
7、堆存储器需要不断申请堆空间,这样会发生存储器泄露。为避免这种情况,需要使用
free()函数释放空间
8、malloc()通常需要接收一共参数,但是我们不知道确切字符数,所以需要与sizeof运算符连用。malloc返回通用指针,即void*类型的指针。
island *p = malloc(sizeof(island));
free(p);
9、strdup()函数总是在堆上创建空间,可以把字符串复制到堆上,
char *copy = strdup(s);
10、什么是“垃圾收集”:
一些语言会跟踪在堆上分配的数据,当不再使用他们的时候,就会释放他们。
11、sizeof运算符告诉你一共结构需要多少空间。
12、在庞大而复杂的程序里面,查找错误十分困难,可以使用valgrind工具,它用于linux操作系统。它通过伪造malloc()监控分配在堆上的数据。
13、为了在可执行文件中加入调试信息,需要加上-g开关,并重新编译源代码。
gcc -g spies.c -o spies
14、valgrind是怎么拦截malloc()与free()的?
malloc()和free()包含在C标准库中,而valgrind有一个库,里面有它自己的malloc()和free(),当用valgrind运行程序时,程序会使用valgrind函数,而不是C标准库中的函数。
15、为什么编译器在编译代码时不默认包含调试信息?
因为调试信息会使可执行文件变大,同时也可能让程序变得更慢。