往期文章:
C规范编辑笔记(一)
C规范编辑笔记(二)
C规范编辑笔记(三)
C规范编辑笔记(四)
C规范编辑笔记(五)
C规范编辑笔记(六)
C规范编辑笔记(七)
C规范编辑笔记(八)
C规范编辑笔记(九)
C规则编辑笔记(十)
C规范编辑笔记(十一)
正文:
放假了,就把这个C规范编辑笔记更新完吧,估计应该还可以更新两三篇估计就结束了,今天我们来讲第十二篇,话不多说,直接开讲~
1、规则 - 结构必须通过引用传递给函数。如果传入的参数是一个数组,建议形参以这样的数组形式比较好,如下:
Bad example:
void func(int32_t *tab, uint32_t count);
//这种形式会被认为是1、要么是通过地址传递的整数;2、或者是一个整数数组
Good example:
void func(int32_t tab[], uint32_t count); //这样就知道tab是一个数组
2、函数的参数如果没有用到,建议去除,否则会占用其堆栈。
3、这种空指针判断可以学习一下:
unsigned char 8string =NULL;
printf("%s %d\n", (string ? string : "null"), 1); //防止传递空指针
4、规则——尽快释放动态分配的内存。 任何动态分配的内存空间在不再需要时必须释放。
5、规则——不要通过 realloc 改变动态分配。
这里说明一下:*realloc库函数作用是:C 库函数 void *realloc(void *ptr, size_t size) 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。
关于该库函数内存分配:
1、如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。
2、如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。老块被放回堆上。
具体关于realloc的使用可以查看相关百度~
例子如下:
Bad example:
#include <stdlib.h>
void fonc(size_t len)
{
long *p;
p = (long *) malloc(len *sizeof(int)); /* 类型不正确 */
...
p = (long *) realloc(p,0); /* 通过 realloc 释放 p*/
...
free(p); /* p的双重释放 */
}
Good example:
#include <stdlib.h>
void fonc(size_t len)
{
long *p;
p = (long *) malloc(len *sizeof(long));
...
free(p); /* realloc 删除并替换为 free */
}
好了,第十二篇C规范编辑笔记分享我们就到这里了,我们第十三篇见~
本人水平有限,上述信息仅供学习参考,如有错误和不妥之处,请多多指教。
另外创作不易,请勿抄袭,如果有帮助到大家的话希望大家可以点个赞,谢谢~