malloc 之后使用memset初始化
memset函数及其用法,C语言memset函数详解

memset函数及其用法,C语言memset函数详解在前面不止一次说过,定义变量时一定要进行初始化,尤其是数组和结构体这种占用内存大的数据结构。
在使用数组的时候经常因为没有初始化而产生“烫烫烫烫烫烫”这样的野值,俗称“乱码”。
每种类型的变量都有各自的初始化方法,memset() 函数可以说是初始化内存的“万能函数”,通常为新申请的内存进行初始化工作。
它是直接操作内存空间,mem即“内存”(memory)的意思。
该函数的原型为:# include <string.h>void *memset(void *s, int c, unsigned long n);函数的功能是:将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。
s 是 void* 型的指针变量,所以它可以为任何类型的数据进行初始化。
memset() 的作用是在一段内存块中填充某个给定的值。
因为它只能填充一个值,所以该函数的初始化为原始初始化,无法将变量初始化为程序中需要的数据。
用memset初始化完后,后面程序中再向该内存空间中存放需要的数据。
memset 一般使用“0”初始化内存单元,而且通常是给数组或结构体进行初始化。
一般的变量如char、int、float、double 等类型的变量直接初始化即可,没有必要用 memset。
如果用 memset 的话反而显得麻烦。
当然,数组也可以直接进行初始化,但memset 是对较大的数组或结构体进行清零初始化的最快方法,因为它是直接对内存进行操作的。
这时有人会问:“字符串数组不是最好用'\0'进行初始化吗?那么可以用 memset 给字符串数组进行初始化吗?也就是说参数 c 可以赋值为'\0'吗?”可以的。
虽然参数c 要求是一个整数,但是整型和字符型是互通的。
但是赋值为 '\0' 和 0 是等价的,因为字符 '\0' 在内存中就是 0。
memset初始化方法

memset初始化方法
`memset`是C语言中用于初始化内存的函数,其名称为“内存设置”。
该函数主要用于将一块内存区域设置为特定的值。
其原型如下:
```c
void memset(void str, int c, size_t n);
```
参数说明:
`str`:指向要设置的内存区域的指针。
`c`:要设置的字符值,即整数值。
它会被转换为字节值,并用来设置内存区域。
`n`:要设置的内存区域的大小,以字节为单位。
`memset`函数将`str`指向的内存区域的前`n`个字节设置为字符值`c`的ASCII码对应的字节值。
如果`c`是0,那么该内存区域将被设置为0。
以下是一个使用`memset`初始化的例子:
```c
include <>
include <>
int main() {
char str[100];
memset(str, 'A', 10); // 将str的前10个字符设置为'A'
printf("%s\n", str); // 输出 "AAAAAAAAAA"
return 0;
}
```
在这个例子中,我们创建了一个大小为100的字符数组`str`,然后使用
`memset`将其前10个字符设置为字符'A'。
因此,当我们打印出`str`时,输出将是"AAAAAAAAAA"。
浅谈C中malloc和memset函数

浅谈C中malloc和memset函数在C中malloc和memset是2个常用的对内存操作的函数。
首先还是来看一下这2个函数的函数原型。
1.malloc函数malloc函数用于从堆上分配指定字节的内存空间。
[c-sharp]view plaincopy?1.void * malloc(size_t n);其中,形参n为要求分配的内存字节数。
如果执行成功,函数范围获得的内存空间的首地址;执行失败,返回值为NULL。
由于函数返回值值的类型为void的指针,因此,可以将void指针类型转换后赋值给任意类型指针,这样就可以通过操作该类型指针来操作从堆上获得的内存空间。
需要注意的是malloc函数分配得到的内存空间是未初始化的。
有时候,在使用前需要对该内存空间进行初始化,memset就派上用场了。
2.memset函数[cpp]view plaincopy?1.void * memset (void * p,int c,size_t n);其中,指针p为所操作的内存空间的首地址,c为每个字节所赋的值,n为所操作内存空间的字节长度,也就是内存被赋值为c的字节数。
在使用memset时经常要注意的它是以字节为单位进行赋值的,所赋值的范围是0x00~0xFF。
若想要对一个double或int型的数组赋值时,就特别需要注意这一点:[cpp]view plaincopy?1.example1:2.char a[4];3.memset(a, '/0', 4);4.example2:5.int a[4];6.memset(a, 1, 4);//这里改成memset(a,1,5*sizeof(int))也是不可以的第一个例子是正确的,memset对字符数组里的每个char类型元素赋值为NULL。
第二个例子显然得到的结果不是把int型数组里的每个元素赋值为了1。
因为memset函数以字节为单位进行赋值,那么数组中一个int型元素的4个字节都将被赋值为1(或者说ASCII码1所对应的字符),实际上它所表示的整数是0x01010101。
calloc(), malloc(), realloc(), free(),alloca()区别

这一行,作用完全等同于:
int* p = (int *)malloc(sizeof(int) * 10);
(5)关于alloca()函数
还有一个函数也值得一提,这就是alloca()。其调用序列与malloc相同,但是它是在当前函数的栈帧上分配存储空间,而不是在堆中。其优点是:当 函数返回时,自动释放它所使用的栈帧,所以不必再为释放空间而费心。其缺点是:某些系统在函数已被调用后不能增加栈帧长度,于是也就不能支持alloca 函数。尽管如此,很多软件包还是使用alloca函数,也有很多系统支持它。
(3)calloc函数的分配的内存也需要自行释放
calloc函数的功能与malloc函数的功能相似,都是从堆分配内存,它与malloc函数的一个显著不同时是,calloc函数得到的内存空间是经过初始化的,其内容全为0。calloc函数适合为数组申请空间,可以将size设置为数组元素的空间长度,将n设置为数组的容量。
(2)使用malloc函数分配的堆空间在程序结束之前必须释放
从堆上获得的内存空间在程序结束以后,系统不会将其自动释放,需要程序员来自己管理。一个程序结束时,必须保证所有从堆上获得的内存空间已被安全释放,否则,会导致内存泄露。
我们可以使用free()函数来释放内存空间,但是,free函数只是释放指针指向的内容,而该指针仍然指向原来指向的地方,此时,指针为野指针,如果此时操作该指针会导致不可预期的错误。安全做法是:在使用free函数释放指针指向的空间之后,将指针的值置为NULL。
所以,在代码中,我们必须将realloc返回的值,重新赋值给 p :
p = (int *) realloc(p, sizeof(int) *15);
甚至,你可以传一个空指针(0)给 realloc ,则此时realloc 作用完全相当于malloc。
memset初始化类对象需要注意

Memset初始化类对象需要注意void *memset(void *s, int v, size_t n);英文释义如下:Copies the value v (converted to type unsigned char) to the first n bytes pointed to by s; returns s.这里s可以是数组名,也可以是指向某一内在空间的指针;v为要填充的值;n为要填充的字节数,通常为sizeof(s);使用memset时要注意的是,memset是逐字节进行填充,所以s一般为char *型。
对于其它类型的s,可以填充的值有两个,0和-1。
这是因为计算机中用二进制补码表示数字,0和二进制补码为全0,-1的二进制补码为全1。
如果要初始化为其它的值,可以用一个for循环,如:for(int i=0;i<n;i++)s[i]=v;memset 某个结构(或其它的数据类型)在C语言中是很常见的代码,其目的是对结构(或其它的数据类型)进行初始化,通常都是将变量置为NULL或者0。
在C++ 中,针对类对象除了用构造函数初始化对象外,也可以使用memset来进行初始化操作(确实有这种情况,不得已而为之,请大家不要把鸡蛋砸过来!)。
但是一定要注意以下所说的这种情况:如果类包含虚拟函数,则不能用 memset 来初始化类对象。
下面是一个例子:class GraphicsObject{protected:char *m_pcName;int m_iId;//etcpublic:virtual void Draw() {}virtual int Area() {}char* Name() { return m_pcName;}};class Circle: public GraphicsObject{void Draw() { /*draw something*/ }int Area() { /*calculate Area*/ }};void main(){GraphicsObject *obj = new Circle; // 创建对象memset((void *)obj,NULL,sizeof(Circle)); // memset to 0obj->Name(); // 非虚函数调用没问题obj->Draw(); // 在这里死得很难看}结果我就不说了。
c malloc函数

c malloc函数C语言中的malloc函数是一种动态内存分配函数,它的作用是在程序运行时动态地申请一块内存空间,并返回该内存空间的指针。
malloc函数可以用于分配任意大小的内存空间,而且该空间在程序结束后会自动释放,这样就可以避免内存泄漏的问题。
malloc函数的使用方法很简单,只需要在程序中包含stdlib.h 头文件,然后调用malloc函数即可。
malloc函数的原型如下:void *malloc(size_t size);其中,size_t是一种无符号整数类型,用于表示要分配的内存空间的大小。
malloc函数返回一个指向分配内存空间的指针,如果分配失败,则返回NULL。
使用malloc函数分配内存空间的代码如下:#include <stdio.h>#include <stdlib.h>int main(){int *p;p = (int *)malloc(sizeof(int));if (p == NULL) {printf('Memory allocation failed.');exit(1);}*p = 10;printf('The value of p is %d.', *p);free(p);return 0;}在上面的代码中,首先定义了一个指向整型变量的指针p,然后调用malloc函数分配了一个整型变量的内存空间。
如果分配成功,则将该内存空间的地址赋给指针p,否则输出一条错误信息并退出程序。
接着,将整型变量的值赋为10,并输出该变量的值。
最后,调用free函数释放内存空间,防止内存泄漏。
malloc函数还可以用于分配多个连续的内存空间,其使用方法如下:#include <stdio.h>#include <stdlib.h>int main(){int *p;int n, i, sum = 0;printf('Enter the number of integers you want to allocate: ');scanf('%d', &n);p = (int *)malloc(n * sizeof(int));if (p == NULL) {printf('Memory allocation failed.');exit(1);}for (i = 0; i < n; i++) {printf('Enter an integer:');scanf('%d', &p[i]);sum += p[i];}printf('The sum of the integers is %d.', sum);free(p);return 0;}在上面的代码中,首先提示用户输入要分配的整型变量的个数,然后调用malloc函数分配n个整型变量的内存空间。
c语言初始化结构体指针

c语言初始化结构体指针在C语言中,可以使用结构体来表示一组相关的数据。
结构体可以包含不同类型的数据成员,并且还可以声明指向结构体的指针。
结构体指针可以通过动态分配内存,从而在程序运行时申请所需的内存空间。
初始化结构体指针的方法有多种,可以通过直接赋值、使用构造函数、使用memset函数等。
下面将详细介绍这些方法。
1.直接赋值直接赋值是最常见的一种方法,可以通过在初始化结构体指针时,为其成员变量赋予具体的值。
例如:```c#include <stdio.h>//定义结构体struct Student {char name[20];int age;float score;};int main() {//初始化结构体指针struct Student *p = NULL;//动态分配内存p = (struct Student *)malloc(sizeof(struct Student)); //直接赋值strcpy(p->name, "Tom");p->age = 18;p->score = 90.5;//输出结果printf("Name: %s\n", p->name);printf("Age: %d\n", p->age);printf("Score: %.2f\n", p->score);//释放内存free(p);return 0;}```在上述代码中,首先定义了一个结构体Student,包含name、age 和score三个成员变量。
然后在main函数中,申请了一个Student类型的指针p,并动态分配了内存空间。
之后,通过直接赋值的方式,为p指向的结构体成员变量赋予具体的值。
最后,使用printf函数输出p指向的结构体成员变量的值,并通过free函数释放内存。
2.使用构造函数在C语言中,可以通过构造函数来初始化结构体指针。
memset初始化数组实现原理

memset初始化数组实现原理
初始化数组可不必使⽤n重for循环。
原理
memset具有初始化数组的功能,能够初始化数组中的每⼀个值。
它是将数组中的每⼀个数的⼆进制的每⼀个字节初始化的。
⽐如初始化int类型的a数组:memset(a,1,sizeof(a)); 得到的其实是0001 0001 0001 0001。
关于0x......不懂的:
代码
#include<cstring>
如果是int数组:
m e mset(g, 0, sizeof(g)); //全部清为0;
memset(g, 0x7f, sizeof(g)); //可全部初始化为⼀个很⼤的数(略⼩于0x7fffffff);
memset(g, 0x3f, sizeof(g)); //稍⼩(适⽤于有加法运算)
memset(g, 0xbf, sizeof(g)); //负值稍⼤
memset(g,-1,sizeof(g)); //全部初始为-1
补充:初始化结构体
memset(结构体变量名,0,sizeof(变量名)); 即可将这个变量中的每⼀个成员变量都赋值为0。
能⽤到的差不多就这些了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else
{
return -1;
free(buf);
buf = NULL;
}
des.assign(buf,strlen(t; endl;
free(buf);
buf = NULL;
}
else
{
return -2;
}
char* buf = (char*)malloc(src_length * 2 * sizeof(src_length));
if(buf != NULL)
{
convert(src.c_str(), src.size(), buf, src_length * 2 * sizeof(src_length) );
if (NULL == p)
{
exit (1);
}
memset(p, 0, sizeof(char) * 10);
}
以下的代码是由问题的--该方法被多次频繁调用,buf指向的动态内存也是被重复创建,释放。但可能都是指向同一块堆内存。没有初始化的话,除第一次外buf中的内容总是有上几次字符转码的残留字符:
malloc之后使用memset初始化
动态分配内存之后初始化:
1.使用malloc--malloc的问题是如果该块内存没有使用过的话第一次运行都是正确的。之后如果重分配再使用,内存的值是不会自动清空的。!!所以再分配时需要初始化下
main()
{
char *p = (int *)malloc(sizeof(char) * 10);