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函数分配的空间也是未初始化的。
用法:
free()到底释放了什么
free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了!