冯诺依曼结构是:数据和代码放在一起。
哈佛结构是:数据和代码分开存在。
内存管理
fiLO 先进后出 栈
FIFO 先进先出 队列
栈的特点是入口即出口,另一个口是堵死的,所以先进去的后出来
队列的特点是入口和出口都有,必须从入口进去,从出口出来,所以先进去的必须先出来,否则就堵住后面的。
堆内存释放时最简单,直接调用free释放即可。 void free(void *ptr);
堆内存申请时,有3个可选择的类似功能的函数:malloc, calloc, realloc
void *malloc(size_t size);
void *calloc(size_t nmemb, size_t size); // nmemb个单元,每个单元size字节
void *realloc(void *ptr, size_t size); // 改变原来申请的空间的大小的
譬如要申请10个int元素的内存:
malloc(40); malloc(10*sizeof(int));
calloc(10, 4); calloc(10, sizeof(int));
栈例子
#include<stdio.h> #include<stdlib.h> typedef struct Lnode { int data; struct Lnode *next; }Lnode; //初始化链栈 void initStack(Lnode *ln) { ln = (Lnode *)malloc(sizeof(Lnode)); ln->next = NULL; } //判断链栈是否为空 int StackEmpty(Lnode *ln) { return (ln->next == NULL ? 1 : 0); } //进栈 void push(Lnode *ln, int x) { Lnode *p; p = (Lnode *)malloc(sizeof(Lnode)); if (p == NULL) { printf("ERROR"); exit(0); } p->next = NULL; p->data = x; p->next = ln->next; ln->next = p; } //出栈 int pop(Lnode *ln, int *x) { Lnode *p = ln->next; if (p == NULL) { return 0; } *x = p->data; ln->next = p->next; free(p); return 1; } void printStack(Lnode *ln) { Lnode *p = ln->next; while (p != NULL) { printf("%d\n", p->data); p = p->next; } } void main() { Lnode ln; int x; initStack(&ln); push(&ln, 2); push(&ln, 3); push(&ln, 4); push(&ln, 5); pop(&ln, &x); printf("出栈元素为:%d\n", x); printStack(&ln); }