熟悉printf,scanf,malloc,realloc,calloc(与C++new的区别)的各种用法
1.printf
函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
2.scanf
是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
3.malloc(动态内存分配)
向系统分配指定size个字节空间,返回vodi*类型(void*指的是未确定类型的指针),void*可以强制转换为任何类型的指针。最后要用free释放空间。
例如:
int *P=(int*)malloc(size(int)*20);free(p)
表示声明一个int类型的指针,并为它分配20个int大小的字节空间。
4.realloc(动态内存调整)
语法:
指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)新的大小可大可小,但如果新的大小小于原内存大小,可能会导致数据丢失
内存分配:
a.如果有足够空间用于扩大mem_address指向的内存块,则分配额外内存,并返回mem_address。这里说的是“扩大”,我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时, realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平。也就是说,如果原先的内存大小后面还有足够的空闲空间用来分配,加上原来的空间大小= newsize。那么就ok。得到的是一块连续的内存。
b.如果原先的内存大小后面没有足够的空闲空间用来分配,那么从堆中另外找一块newsize大小的内存。并把原来大小内存空间中的内容复制到newsize中。返回新的mem_address指针。(数据被移动了)。老块被放回堆上。
返回值:
如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。返回失败的话,原内存不会改变不会移动也不会释放。
注:
传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的.
5.calloc(动态内存分配并清零)
功能:
在内存的动态存储区分配n个长度为size的连续空间,并自动初始化为零(malloc不初始化,里面是随机值),函数返回一个指向分配存储地址的指针(就是强制转换的类型);若分配不成功,则返回一个NULL类型的指针。
语法:
指针名=(数据类型*)calloc(分配的数据类型的个数,数据类型)
例如:
int *p=(int*)calloc(20,size(int))
与new的区别:
new可以返回指定类型的指针,并自动计算所需空间大小。例如:
int *p=new int
指的是返回int*类型的指针,并分配size(int)大小的空间。
int *p=new int[100]
指的是返回int*类型的指针,并分配100个size(int)大小的内存空间。
calloc则必须指出强制转换类型即int *p=calloc(20,size(int))
是错误的。且要标注分配空间的大小。
编译屏障(没找到这个,只找到了内存屏障)
CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。