C,C++fill函数与memset函数的区别

合集下载

memset函数及其用法,C语言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函数的用法举例一、概述memset函数是C语言中的一个库函数,其作用是将某一块内存空间设置为指定的值。

该函数通常用于初始化一段内存空间,或者清空某些数据结构等。

二、函数原型下面是memset函数的原型:void *memset(void *s, int c, size_t n);其中,s表示要设置的内存空间的起始地址;c表示要设置的值;n表示要设置的字节数。

三、用法举例以下是几个使用memset函数的例子:1. 初始化数组可以使用memset函数来初始化一个数组。

例如,下面代码将一个长度为10的整型数组a全部初始化为0:int a[10];memset(a, 0, sizeof(a));2. 清空字符串可以使用memset函数来清空一个字符串。

例如,下面代码将一个字符串s全部清空:char s[100] = "hello world";memset(s, 0, sizeof(s));3. 初始化结构体可以使用memset函数来初始化一个结构体。

例如,下面代码将一个名为person的结构体全部初始化为0:struct Person {char name[20];int age;};struct Person person;memset(&person, 0, sizeof(person));4. 清空动态分配的内存在动态分配内存时,有时需要清空已经分配好的内存空间。

可以使用memset函数来完成这个任务。

例如,下面代码清空了一个长度为100的字符型指针p所指向的内存区域:char *p = (char *)malloc(100);memset(p, 0, 100);5. 初始化二维数组可以使用memset函数来初始化一个二维数组。

例如,下面代码将一个3行4列的整型数组b全部初始化为1:int b[3][4];memset(b, 1, sizeof(b));四、注意事项在使用memset函数时需要注意以下几点:1. 要清空的内存空间必须已经被分配好,否则可能会导致程序崩溃;2. 要清空的内存空间大小必须正确,否则可能会导致程序出错;3. 要清空的值必须是一个字符或者一个整数类型,否则可能会导致程序出错;4. 在使用memset函数时要小心指针操作,以免出现指针越界等问题。

memset在java中的用法

memset在java中的用法

一、memset函数概述memset函数是C/C++语言中的一个字符串处理函数,主要用于将指定内存块的前n个字节设置为特定的值。

在C/C++中,使用该函数可以快速对数组或结构体等数据进行初始化操作,提高程序的执行效率。

在Java语言中并没有提供对应的memset函数,但是可以利用Java的数组和循环结构来实现相似的功能。

二、Java中的数组初始化在Java中,可以通过以下方式来初始化数组:```javaint[] array = new int[10]; // 创建一个长度为10的整型数组,并初始化为0```上面的代码创建了一个长度为10的int型数组,并将数组的每个元素都初始化为0。

在Java中,数组的初始化工作可以通过在声明数组的同时进行赋值操作来完成。

三、使用循环结构对数组进行初始化如果需要将数组的每个元素都初始化为特定的值,可以通过循环结构来实现:```javaint[] array = new int[10]; // 创建一个长度为10的整型数组for (int i = 0; i < array.length; i++) {array[i] = 1; // 将数组的每个元素都初始化为1}```上面的代码通过for循环遍历数组,并将每个元素的值初始化为1。

通过循环结构,可以对数组进行灵活的初始化操作,满足不同的需求。

四、自定义方法对数组进行初始化除了使用循环结构,还可以通过自定义方法来对数组进行初始化操作,提高代码的复用性和可读性:```javapublic class ArrayUtils {public static void initializeArray(int[] array, int value) {for (int i = 0; i < array.length; i++) {array[i] = value; // 将数组的每个元素都初始化为指定的值}}}```通过自定义方法,可以将数组初始化的逻辑抽象成一个独立的功能模块,方便其他地方进行调用。

memset函数初始化结构体

memset函数初始化结构体

memset函数初始化结构体一、背景介绍在C语言中,我们经常需要使用结构体来存储一些数据,但是在使用前需要先初始化结构体的每一个成员变量。

为了方便地初始化结构体,C语言提供了一个函数——memset函数。

二、memset函数的定义和作用memset函数的定义如下:```cvoid *memset(void *s, int c, size_t n);```其中,s表示要初始化的内存地址,c表示要填充的值(通常是0),n表示要填充的字节数。

memset函数的作用是将s所指向的内存块(即结构体)中的每个字节都设置为指定值c。

这个函数通常用于初始化数组、字符串以及结构体等数据类型。

三、使用memset函数初始化结构体在使用memset函数初始化结构体时,需要注意以下几点:1. 结构体中每个成员变量所占用的字节数必须相同。

2. 如果结构体中包含指针类型成员变量,则不能使用memset函数进行初始化。

3. 在对结构体进行初始化之前,需要先定义好该结构体,并且分配好内存空间。

下面是一个示例程序:```c#include <stdio.h>#include <string.h>struct student {char name[20];int age;float score;};int main() {struct student s;memset(&s, 0, sizeof(s));printf("name: %s\n", );printf("age: %d\n", s.age);printf("score: %f\n", s.score);return 0;}```在上面的程序中,我们定义了一个结构体student,包含三个成员变量:name、age和score。

然后使用memset函数将该结构体的每个成员变量都初始化为0。

Memset、Memcpy、Strcpy 的作用和区别

Memset、Memcpy、Strcpy 的作用和区别

1) Memset原型:extern void *memset(void *buffer, int c, int count);用法:#include <string.h>功能:把buffer所指内存区域的前count个字节设置成字符c。

说明:返回指向buffer的指针。

用来对一段内存空间全部设置为某个字符例如:char a[10];memset(a, '\0', sizeof(a));memset可以方便的清空一个结构类型的变量或数组。

如:struct _test{ char s[10];int x;int y;};变量struct _test st;(1)一般清空st的方法如下:st.s[0] = '\0'; st.x =0; st.y =0;(2) 用memset方法如下:memset(&st,0,sizeof(struct _test));数组:struct _test st[10];memset(st,0,sizeof(struct _test)*10); //清空方法//memset 源码的实现C语言#include <mem.h>void* memset(void* s, int c, size_t n){unsigned char* p = (unsigned char*) s;while (n > 0){*p++ = (unsigned char) c;--n;}return s;}(2)memcpy原型:extern void *memcpy(void*dest,void*src,unsignedintcount); 用法:#include <string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域。

说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针.可以拿它拷贝任何数据类型的对象。

CC++中memset()函数详解及其作用介绍

CC++中memset()函数详解及其作用介绍

CC++中memset()函数详解及其作⽤介绍memset 函数是内存赋值函数,⽤来给某⼀块内存空间进⾏赋值的;包含在<string.h>头⽂件中,可以⽤它对⼀⽚内存空间逐字节进⾏初始化;原型为:void *memset(void *s, int v, size_t n);这⾥s可以是数组名,也可以是指向某⼀内在空间的指针;v为要填充的值;n为要填充的字节数;例⼦:struct data{char num[100];char name[100];int n;};struct data a, b[10];memset( &a, 0, sizeof(a) ); //注意第⼀个参数是指针类型,a不是指针变量,要加&memset( b, 0, sizeof(b) ); //b是数组名,就是指针类型,不需要加&例2:char str[9];我们⽤memset给str初始化为“00000000”,⽤法如下memset(str,0,8);注意,memset是逐字节拷贝的。

例3:int num[8];我们⽤memset给str初始化为{1,1,1,1,1,1,1,1},memset(num,1,8);//这样是不对的⼀个int是4个字节的,8个int是32个字节,所以⾸先要赋值的长度就不应该为8⽽是32。

因为memset是逐字节拷贝,以num为⾸地址的8字节空间都被赋值为1,即⼀个int变为0X00000001 00000001 00000001 00000001,显然,把这个数化为⼗进制不会等于1的。

所以,在memset使⽤时要千万⼩⼼,在给char以外的数组赋值时,只能初始化为0或者-1。

(如果⽤memset(a,1,20);就是对a指向的内存的20个字节进⾏赋值,每个都⽤ASCII为1的字符去填充,转为⼆进制后,1就是00000001,占⼀个字节。

⼀个INT元素是4字节,合⼀起就是1000000010000000100000001,就等于16843009,就完成了对⼀个INT元素的赋值了。

memset在c语言中的用法

memset在c语言中的用法

文章标题:深入探讨memset在C语言中的用法1. 引言在C语言中,memset是一个非常常用的函数,它通常被用来将一块内存空间的内容全部设置为某个特定的值。

memset函数的用法非常灵活,可以用来初始化数组、清空字符串等。

本文将深入探讨memset在C语言中的用法,包括其语法、参数和常见的应用场景。

2. memset函数的语法和参数memset函数的原型为:```cvoid *memset(void *s, int c, size_t n);```其中,s为指向要填充的内存块的指针,c为要设置的值,n为要设置的字节数。

memset函数将s所指向的内存块的前n个字节设置为值c。

3. 常见用法示例示例1:初始化数组```cint arr[5];memset(arr, 0, sizeof(arr));```上述代码将数组arr的所有元素都设置为0,这是一种常见的数组初始化方法。

示例2:清空字符串```cchar str[100];strcpy(str, "Hello, world!");memset(str, 0, sizeof(str));```上述代码将字符串str中的所有字符都清空为0,达到了清空字符串的效果。

4. memset在实际项目中的应用在实际的项目开发中,memset经常被用于内存初始化、数据清零等操作。

比如在网络编程中,经常需要将结构体变量清零后再使用;在密码学中,需要清空某些敏感数据后再释放内存等。

memset函数的灵活性和高效性使得它在C语言中有着广泛的应用。

5. 我对memset的个人见解在我看来,memset函数虽然简单,但是其在C语言中的重要性不容忽视。

它不仅可以提高代码的可读性,而且在一定程度上还能提高程序的执行效率。

由于memset函数是C标准库中的一部分,因此在任何支持C标准库的环境中都可以使用,具有很高的通用性。

6. 总结通过对memset在C语言中的用法进行深入的探讨,我们发现它具有非常重要的作用,可以用来初始化数组、清空字符串等。

c语言memset详解

c语言memset详解

c语⾔memset详解void *memset(void *s, int ch, n);(int ch可以是char或int)将s所指向的某⼀块内存中的每个的内容全部设置为ch指定的ASCII值,块的⼤⼩由第三个参数指定,这个函数通常为新申请的内存做初始化⼯作,其返回值为指向S的指针。

memset按字节赋值。

需要的头⽂件在C中 <string.h>在C++中 <cstring>void *memset(void *s, int ch, n);解释:将s中前n个字节(typedef unsigned int size_t)⽤ ch 替换并返回 s 。

memset:作⽤是在⼀段内存块中填充某个给定的值,它是对较⼤的或进⾏清零操作的⼀种最快⽅法[1]。

常见错误第⼀:搞反了 ch 和 n 的位置.⼀定要记住如果要把⼀个char a[20]清零,⼀定是 memset(a,0,20);⽽不是 memset(a,20,0);第⼆:过度使⽤memset,我想这些员可能有某种⼼理阴影,他们惧怕未经初始化的内存,所以他们会写出这样的代码:char buffer[20];memset(buffer,0,sizeof(char)*20);strcpy(buffer,"123");这⾥的memset是多余的. 因为这块马上就被覆盖了,清零没有意义.第三:其实这个错误严格来讲不能算⽤错memset,但是它经常在使⽤memset的场合出现int some_func(struct something *a){……memset(a,0,sizeof(a));…}这⾥错误的是VC函数传参中的降级,导致sizeof(a),返回的是⼀个 something*类型⼤⼩的的数,如果是32位,就是4字节。

常见问题问:为何要⽤memset置零?memset(&Address,0,sizeof(Address));经常看到这样的⽤法,其实不⽤的话,分配数据的时候,剩余的空间也会置零的。

C语言memset函数使用方法详解

C语言memset函数使用方法详解

C语⾔memset函数使⽤⽅法详解
C语⾔memset函数使⽤⽅法详解
⼀。

函数原形 void * memset(void*s, int ch,size_t n)
⼆。

函数作⽤将以s内存地址为⾸的连续n个字节的内容置成ch,⼀般⽤来对⼤量结构体和数组进⾏清零
三。

常见错误
1.搞反了 ch 和 n的位置
对char[20]清零,⼀定是 memset(a,0,20);
2.过度使⽤memset
3.其实这个错误严格来讲不能算⽤错memset,但是它经常在使⽤memset的场合出现
int fun(strucy something * a)
{
.....
memset(a,0,sizeof(a));
.....
}
这⾥错误的原因是VC函数传参过程中的指针降级,导致sizeof(a),返回的是⼀个 something*指针类型⼤⼩的的字节数,如果是32位,就是4字节。

经常使⽤这种形式
memset(a,0,n*sizeof(type));
4.想对数组初始化为1
int main()
{
int a[20];
memset(a,1,20);
}
这种⽅法不能初始化为1。

原因是memset函数是按照字节赋值的,int 是4个字节所以为0x01010101,就是⼗进制的16843009。

如有疑问请留⾔或者到本站社区交流讨论,感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。

c 语言中的memset函数

c 语言中的memset函数

C语言中使用memset的注意事项2007-08-10 09:31memset为内存填充函数,包含在<string.h>头文件中,可以用它对一片内存空间进行初始化,其原型为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函数的用法:将已开辟内存空间s 的首n 个字节的值设为值 c下面是一个例子#include <stdio.h>#include <string.h>main(){char *s="Golden Global View";clrscr();memset(s,'G',6);printf("%s",s);getchar();return 0;}memset() 函数常用于内存空间初始化。

如:char str[100];memset(str,0,100);memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘\0’;例:char a[100];memset(a, '\0', sizeof(a));memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。

C语言memset函数及其用法

C语言memset函数及其用法
memset(p, 0, sizeof(*p)); //*p表示的是一个字符变量, 只有一字节 0 -52 -52 -52 -52 -52 -52 -52 -52 -52
memset(p, 0, sizeof(str)); 0000000000
memset(str, 0, sizeof(str)); 0000000000
memset(p, 0, 10); //直接写10也行, 但不专业 0000000000
参考:Βιβλιοθήκη 将指针变量s所指向的前n字节的内存单元用一个整数c替换注意c是int型
C语言 memset函数及其用法
定义
void *memset(void *s, int c, unsigned long n);
描述
将指针变量 s 所指向的前 n 字节的内存单元用一个“整数” c 替换,注意 c 是 int 型。s 是 void* 型的指针变量,所以它可以为任何类型的数据 进行初始化。
例子
# include <stdio.h> # include <string.h> int main(void) {
int i; //循环变量 char str[10]; char *p = str; memset(str, 0, sizeof(str)); //只能写sizeof(str), 不能写sizeof(p) for (i=0; i<10; ++i) {
printf("%d\x20", str[i]); } printf("\n"); return 0; }
根据memset函数的不同,输出结果也不同,分为以下几种情况:
memset(p, 0, sizeof(p)); //地址的大小都是4字节 0 0 0 0 -52 -52 -52 -52 -52 -52

memset 库函数

memset 库函数

memset 库函数【最新版】目录1.memset 库函数的概念与作用2.memset 库函数的使用方法3.memset 库函数的实例解析4.memset 库函数的注意事项正文【1.memset 库函数的概念与作用】memset 库函数是 C 语言中的一个内存操作函数,用于设置一块内存空间的内容。

它的主要作用是将一块内存空间的内容全部设置为一个指定的值。

memset 函数在程序设计中常常用于初始化数组、字符串等数据结构,可以有效地提高程序的运行效率。

【2.memset 库函数的使用方法】memset 库函数的使用方法如下:```cvoid *memset(void *s, int c, size_t n);```参数说明:- s:指向要填充的内存空间的指针。

- c:要设置的字符或值。

一般情况下,以字节为单位。

- n:要设置的字符或值的数量。

返回值:memset 函数返回一个指向已填充内存空间的指针。

【3.memset 库函数的实例解析】下面举一个使用 memset 函数初始化数组的例子:```c#include <stdio.h>#include <string.h>int main() {int arr[10];// 使用 memset 函数将数组 arr 的内容全部设置为 0memset(arr, 0, sizeof(arr));for (int i = 0; i < 10; i++) {printf("%d ", arr[i]);}return 0;}```运行结果:```0 0 0 0 0 0 0 0 0 0```【4.memset 库函数的注意事项】在使用 memset 函数时,需要注意以下几点:1.传递给 memset 函数的指针 s 必须是指向一块有效内存空间的指针。

如果传递的指针为 NULL,则 memset 函数的行为是未定义的。

memset和fill_n比较

memset和fill_n比较

memset和fill_n比較1.memset是对每个字节赋值,而int有4字节(32位)比如这样,memset(a,1,sizeof(a));则a中的每个元素都被赋值成为2进制数为,00000001000000010000000100000001,的数转换成10进制就是16843009所以,一般用memset对数组赋0或-1,赋其他的值就要用循环来实现.函数名: memset//要包含头文件<string.h>功能: 设置s中的所有字节为ch, s数组的大小由n给定用法: void *memset(void *s, char ch, unsigned n);程序例:#include <string.h>#include <stdio.h>#include <mem.h>int main(void){char buffer[] = "Hello world\n";printf("Buffer before memset: %s\n", buffer);memset(buffer, '*', strlen(buffer) - 1);printf("Buffer after memset: %s\n", buffer);return 0;}注意它的用法,不一定是赋为0,其实就是把一个数组的每个单元写上ch,说明了就是写上一个数.对于对int之类的数组,只能用memset对其初始化为0或-1。

如:int a[];memset(a,0,sizeof(a))://sizof(a)=sizeof(int)*n;而对于char型,可以赋任何字符。

如:char a[];memset(a,'0',sizeof(a));//sizeof(a)=1*n;2,fill_n(void *s,unsigned n,char n)//要包含头文件 <iostream>与memset的不同不仅在于函数参数的顺序,而且对int型的数组赋值,fil_n可以赋任何值,而memset只能赋0或-1.。

关于循环赋值、memset与fill的效率测试

关于循环赋值、memset与fill的效率测试

关于循环赋值、memset与fill的效率测试最近⼀直在做图论的题⽬。

对于初始化的效率要求⽐较⾼。

正巧我也对这三个函数不是很清楚。

就写了个测试程序来测试效率测试程序:#include <bits/stdc++.h>//#pragma GCC optimize(2)using namespace std;#define max 100000000+5int a[max];int main(){time_t beg,end;cout<<"---------------------------for\n";beg=clock();for(int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 1 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 2 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 3 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 4 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 5 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 6 cost: "<<end-beg<<"MS"<<endl;cout<<"----------------register---for\n";beg=clock();for(register int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 1 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(register int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 2 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(register int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 3 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(register int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 4 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(register int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 5 cost: "<<end-beg<<"MS"<<endl;beg=clock();for(register int i=0;i<max;++i) a[i]=0;end=clock();cout<<"test 6 cost: "<<end-beg<<"MS"<<endl;cout<<"---------------------------fill\n";beg=clock();fill(a,a+max,0);end=clock();cout<<"test 1 cost: "<<end-beg<<"MS"<<endl;beg=clock();fill(a,a+max,0);end=clock();cout<<"test 2 cost: "<<end-beg<<"MS"<<endl;beg=clock();fill(a,a+max,0);end=clock();cout<<"test 3 cost: "<<end-beg<<"MS"<<endl;beg=clock();fill(a,a+max,0);end=clock();cout<<"test 4 cost: "<<end-beg<<"MS"<<endl;beg=clock();fill(a,a+max,0);end=clock();cout<<"test 5 cost: "<<end-beg<<"MS"<<endl; beg=clock();fill(a,a+max,0);end=clock();cout<<"test 6 cost: "<<end-beg<<"MS"<<endl; cout<<"---------------------------memset\n";beg=clock();memset(a,0,sizeof(a));end=clock();cout<<"test 1 cost: "<<end-beg<<"MS"<<endl; beg=clock();memset(a,0,sizeof(a));end=clock();cout<<"test 2 cost: "<<end-beg<<"MS"<<endl; beg=clock();memset(a,0,sizeof(a));end=clock();cout<<"test 3 cost: "<<end-beg<<"MS"<<endl; beg=clock();memset(a,0,sizeof(a));end=clock();cout<<"test 4 cost: "<<end-beg<<"MS"<<endl; beg=clock();memset(a,0,sizeof(a));end=clock();cout<<"test 5 cost: "<<end-beg<<"MS"<<endl; beg=clock();memset(a,0,sizeof(a));end=clock();cout<<"test 6 cost: "<<end-beg<<"MS"<<endl; return0;}View Code开启o2优化之后综上,当需要数组初始化为0,-1,inf时,memset最快,其他时候,循环赋值 + O2优化最快。

浅谈C中malloc和memset函数

浅谈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。

bool数组 memset

bool数组 memset

bool数组 memsetbool数组是一种在编程中常用的数据结构,用于存储逻辑值(即true或false)。

而memset是C++中的一个函数,用于将指定内存区域的每个字节都设置为指定的值。

在实际编程中,使用bool数组可以方便地存储和处理逻辑判断。

通过memset函数,我们可以快速地对bool数组进行初始化,将所有元素的值设置为指定的逻辑值。

memset函数的使用非常简单,其原型为:```c++void* memset(void* ptr, int value, size_t num);```其中,ptr是指向要填充的内存区域的指针,value是要设置的值,num是要设置的字节数。

我们需要声明一个bool数组,并分配内存空间。

例如,我们可以声明一个长度为10的bool数组:```c++bool arr[10];```然后,我们可以使用memset函数将数组的所有元素设置为true 或false。

如果我们要将数组的所有元素设置为true,可以这样写:```c++memset(arr, true, sizeof(arr));```同样,如果我们要将数组的所有元素设置为false,可以这样写:```c++memset(arr, false, sizeof(arr));```需要注意的是,memset函数是按字节进行设置的,因此对于bool 类型的数组,每个元素占用一个字节。

所以,在使用memset函数时,需要将num参数设置为数组长度乘以每个元素所占用的字节数,即sizeof(arr)。

除了bool数组,memset函数也可以用于其他类型的数组,例如int、char等。

只需要将ptr参数的类型改为相应的指针类型,value参数的类型改为所需的值,num参数的值改为数组长度乘以每个元素所占用的字节数。

需要注意的是,在使用memset函数时,要确保所填充的内存区域是合法的,且不会越界。

否则,可能会导致程序崩溃或产生不可预测的结果。

c++给数组整体赋初值

c++给数组整体赋初值

c++给数组整体赋初值1.memsetmemset是计算机中C/C++语⾔初始化函数。

作⽤是将某⼀块内存中的内容全部设置为指定的值(⼆进制补码),这个函数通常为新申请的内存做初始化⼯作。

头⽂件:#include<cstring>memset()函数原型:extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组; c:是赋给buffer 的值; count:是buffer的长度。

c的取值范围应该在0~~255,因为该函数只取ch的后⼋位赋值给你所输⼊的范围的每个字节。

⽐如int a[5]赋值memset(a,-1,sizeof(int )*5)与memset(a,511,sizeof(int )*5)所赋值的结果是⼀样的都为-1;因为-1的⼆进制码为(11111111 11111111 11111111 11111111)⽽511的⼆进制码为(00000000 00000000 00000001 11111111)后⼋位都为(11111111),所以数组中每个字节,如a[0]含四个字节都被赋值为(11111111),其结果为a[0](11111111 11111111 11111111 11111111),即a[0]=-1,因此⽆论ch多⼤只有后⼋位⼆进制有效,⽽后⼋位的范围在(0~255)中改。

使⽤⽅法:memset函数按字节对内存块进⾏初始化,所以不能⽤它将int数组初始化为0和-1之外的其他值(除⾮该值⾼字节和低字节相同)。

int q[100];(1)赋值为-1memset(q,-1,sizeof(q))和memset(q,255,sizeof(q))以及memset(q,0xff,sizeof(q));是等价的,都是给q数组赋值-1.(2)赋值为0memset(q,0,sizeof(q))(3)赋其它值memset(q,-127,sizeof(q));和memset(q,0x81,sizeof(q))是等价的,赋值后q[1]=-2122219135原理:-127转换成⼆进制为111111111(原码),它的补码10000001,填充int的4个字节为10000001 10000001 10000001 10000001,⽽10000001 10000001 10000001 10000001的补码为:11111110 01111110 01111110 0111111010000001 10000001 10000001 10000001的原码为(补码加1):11111110 01111110 01111110 01111111(最⾼位的1是符号位,不取反)2.fillfill(q,q+3,5);//给q数组的q[0],q[1],q[2]赋值为5头⽂件:#include<algorithm>格式:fill(初始位置first,最终位置last,值) //填充范围为[first,last)(备注:fill⼤家在竞赛中使⽤较少,原因不详,据说是速度太慢。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档