前言
关于空间分配问题,在C语言中,可以使用malloc和memset结合的方式,进行空间分配以及初始化,而在C++中,可以使用new。
本文仅讲一下我自己对memset的理解。
malloc
作为有可能会成对出现的函数,不得不先提一下malloc。
memory allocation,字面意思,动态内存分配。
#include<stdlib.h>//头文件
void *malloc(unsigned int size);//函数形式
解释:
返回一个无类型指针。
如果你的指针要去接这一块空间,那么就需要在malloc函数前面加上强制类型转换。
例如(int*)malloc(sizeof(int))。
函数解读:
申请一块大小为size的连续空间。
注:size不能为负数。(要不也没啥意义...)
memset
(说实话,我研二快读完了才知道有这个函数...)
memory set,对内存进行初始化,或者是值的分配。
#include<string.h>//头文件,与malloc还不同。
void *memset(void *s, int ch, size_t n);//函数形式
暂且不考虑返回值,这个函数是可以单独拿出来使用的。
解释:
s中当前位置开始向后的n个字节中,把n个字节的每个字节都替换成ch。
这该如何理解呢?
我借用刚刚看过的一些讲解和例子来说明一下。
第一种情况:
char str[4];
memset(str,'1',4);
解释:
char数组str,一共有4字节空间,我们将全部的字符数组成员,都改为'1'。
那么我们在调用的时候,str[0]一直到str[3]将全部为'1',即字符1。
第二种情况:
char arr[4];
memset(arr,1,4);
那就代表:
仅仅将数组arr的前四个字节,也就是:第一个元素的全部4个字节当中的每个字节,都变成了1。
众所周知:1B=8bit,那么就是将这个元素的每个字节都变成了0000 0001,合起来数组arr的第一个元素也就是0x01010101。
而后三个元素还是未分配内容的状态。
故,我们可以浅认为:
memset的作用是:为大空间结构体或大数组空间初始化或清零。
浅谈初始化
char a[80];
char* b;
int c;
int d[3];
string e;
在abcde的5种情况当中,仅有第五种string变量是默认带有初始化的,因为string是类封装的,与变量类型还有所不同,e=""。其余的均不可使用。
其中d作为数组,如果输出d的地址,也是存在的,已经给分配好了,只不过内容是乱码,还并没有初始化分配。
总结
memset是对于空间的使用,一般就是进行初始化,不要认为有new了就放弃使用这个,还是很灵活的。
感谢大家~