C-动态分配内存

终于学到了C的动态操作了,之前的学习内容大部分都是需要指定长度的操作,实际应用中是绝对不能行的,毕竟总不能随时覆盖吧。

动态分配内存

1.mollloc

2.free

使用mollloc申请内存,可以把变量作为参数传递给size大小,也可以接收用户传递的size尺寸,这是它的优势。Mollloc申请内存,返回的是void* 类型指针,参数是int,单位是byte,申请成功后,返回该内存的首地址,当申请的内存大于目前剩余内存块(整块),则内存申请会失败,返回null。

申请内存使用过后,需要释放,否则会产生内存使用完毕的情况出现,释放内存的函数为free。申请一次内存,就需要释放一次内存,否则程序会发生错误。

释放内存后,指针需要重置为null,否则该指针则变为野指针,会出现错误。

使用如下:

char* p = (char *)malloc(8);//这里的8还可以使用变量,意味着用户可以输入自己想要申请的数字。

if(p){

for (char i = 0; i < 8;i++) {

p[i] = i + 1;

}

}

free(p);

p = null;//清理指针,避免出现if(p)的情况。

链表

链表是使用指针把若干对象串联在一起形成链状的数据结构,其中最重要的是串联使用的指针,当前对象的指针指向了下一个对象地址,如下:

代码设置链表如下:

struct Student

{

int id;

char name[16];

Student* next;

};

Student ss[4] =

{

{20170414,”a”,0},

{20170415,”b”,0},

{20170416,”c”,0},

{20170417,”d”,0}

};

ss[0].next = &ss[1];

ss[1].next = &ss[2];

ss[2].next = &ss[3];

ss[3].next = 0;

Student* p = &ss[0];

 

打开内存调试窗口,查看链表头,能很明显的看到“链”,如下:

链表头是指链表的第一个对象,我们通常使用链表头来代表整个链表。

链表尾是值链表的最后一个对象,它的next必需为NULL;

1.有头链表的构造

由于有链表头就可以定义为一个链表,那么我们只需要一个链表头,不需要里面具体的链表对象,也可以表达链表,实现了链表的动态化,在添加删除链表时都会更加的灵活。

2.插入和删除节点

节点可以插入和删除,是改变next指针的指向,如下:

void add(Student* target,Student* obj)

{

obj->next = target->next;

target->next = obj;

};

void del(Student* target, Student* obj)

{

target->next = obj->next;

obj = 0;

};

链表实际应用中可以当做指针型的没有长度单位的数组,突破了C语言数组长度的限定,在增删操作中也大量的节省了内存,数组增删时,节点后面所有的元素都要被操作,而链表不需要,它只需要改变节点的指向即可,相比较而言,效率会高更多。