C语言数据结构小点

数据结构中的status变量 

1.这里的Status是一个结构或变量类型。STATUS是返回的状态,程序中的error,ok就是和它对应的!

 2.typedef int Status; /*类型名定义用status代替int*/ 这样你应该理解了吧,status push(linkstack top,elemtype e) 的意思就是:int push(linkstack top,elemtype e),Status只是int的替身。
原文链接:https://blog.csdn.net/sugesi/article/details/53823479

 

 

exit与return区别

1. exit用于结束正在运行的整个程序,它将参数返回给OS,把控制权交给操作系统;而return 是退出当前函数,返回函数值,把控制权交给调用函数。
2. exit是系统调用级别,它表示一个进程的结束;而return 是语言级别的,它表示调用堆栈的返回。
3. 在main函数结束时,会隐式地调用exit函数,所以一般程序执行到main()结尾时,则结束主进程。exit将删除进程使用的内存空间,同时把错误信息返回给父进程。

原文链接:https://blog.csdn.net/firefly_2002/article/details/7960595

 

 

malloc函数

 

malloc函数可以从上获得指定字节的内存空间,其函数声明如下:

 

void * malloc(int n);

 

如果函数执行成功,malloc返回获得内存空间的首地址;如果函数执行失败,那么返回值为NULL。

申请内存方法的理解与总结:

若要为函数形参内容malloc内存,则形参指针需要为二级指针**P

 

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #include <string.h>
 4 char* test()
 5 {
 6     char *p;
 7     p = (char*)malloc(10 * sizeof(char));
 8     strcpy(p, "123456789" );
 9     return p;
10 }
11 void main()
12 {
13     char *str = NULL ;
14     str = test();
15     printf("%s\n", str);
16     free(str);
17 }

 

 

 

若要为在函数体中定义的某指针malloc内存,则使用一级指针*p

 

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #include <string.h>
 4 void test(char **p)
 5 {
 6     *p = (char*)malloc(10 * sizeof(char));
 7     strcpy(*p, "123456789" );   
 8 }
 9 void main()
10 {
11     char *str = NULL ;
12     test(&str);
13     printf("%s\n", str);
14     free(str);
15 }

 

 

 

malloc函数分配得到的内存空间是未初始化的。因此,一般在使用该内存空间时,要调用另一个函数memset来将其初始化为全0

注意事项

A、申请了内存空间后,必须检查是否分配成功。

B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

原文链接:https://blog.csdn.net/HuffieWang/article/details/51744043?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158927807219724843309479%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=158927807219724843309479&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2-51744043.nonecase&utm_term=malloc%E5%87%BD%E6%95%B0

 

memset函数:

函数原型是:void *memset(void *s, int ch, size_t n);

函数功能是:将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针,它是对较大的结构体或数组进行清零操作的一种最快方法。
 头文件是:<memory.h>或<string.h>
memset函数通常用来对一块已经分配地址的内存进行初始化,并且通常初始化为0或者字符'\0'(实际上是一样的)

 

realloc函数

realloc函数的功能比malloc函数和calloc函数的功能更为丰富,可以实现内存分配和内存释放的功能,其函数声明如下:

原型:void * realloc(void * p,int n);

所需头文件:#include<stdlib.h>或#include <malloc.h>

指针名=数据类型*)realloc(要改变内存大小的指针名,新的大小)。//新的大小一定要大于原来的大小,不然的话会导致数据丢失!

其中,指针p必须为指向堆内存空间的指针,即由malloc函数、calloc函数或realloc函数分配空间的指针。realloc函数将指针p指向的内存块的大小改变为n字节。如果n小于或等于p之前指向的空间大小,那么。保持原有状态不变。如果n大于原来p之前指向的空间大小,那么,系统将重新为p从堆上分配一块大小为n的内存空间,同时,将原来指向空间的内容依次复制到新的内存空间上p之前指向的空间被释放relloc函数分配的空间也是未初始化的。

 

用法:

1. realloc失败的时候,返回NULL
2. realloc失败的时候,原来的内存不改变,不会释放也不会移动
3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址
4. 如果size为0,效果等同于free()。这里需要注意的是只对指针本身进行释放,例如对二维指针**a,对a调用realloc时只会释放一维,使用时谨防内存泄露
5. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的,或者是NULL
6.传递给realloc的指针可以为空,等同于malloc

 

 

 

 

free()到底释放了什么

free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了

posted @ 2020-04-25 10:49  YOLO-in-the-sun  阅读(551)  评论(0编辑  收藏  举报