首页 > 编程知识 正文

奔驰c驾驶模式详解,entp-c型人格详解

时间:2023-05-03 09:29:25 阅读:235021 作者:703

菜鸟教程 memset

1️⃣C++中memset()用法 memset()函数原型是extern void *memset(void *buffer, int c, int count)

buffer:为指针或是数组
c:是赋给buffer的值
count:赋值buffer中的位数

1. memset是以字节为单位,初始化内存块。

当初始化一个字节单位的数组时,可以用memset把每个数组单元初始化成任何你想要的值,比如,
char data[10];
memset(data, 1, sizeof(data)); // right
memset(data, 0, sizeof(data)); // right
而在初始化其他基础类型时,则需要注意,比如,
int data[10];
memset(data, 0, sizeof(data)); // right
memset(data, -1, sizeof(data)); // right
memset(data, 1, sizeof(data)); // wrong, data[x] would be 0x0101 instead of 1

2. 当结构体类型中包含指针时,在使用memset初始化时需要小心。

比如如下代码中,
struct Parameters {
int x;
int* p_x;
};
Parameters par;
par.p_x = new int[10];
memset(&par, 0, sizeof(par));
当memset初始化时,并不会初始化p_x指向的int数组单元的值,而会把已经分配过内存的p_x指针本身设置为0,造成内存泄漏。同理,对std::vector等数据类型,显而易见也是不应该使用memset来初始化的。

3. 当结构体或类的本身或其基类中存在虚函数时,也需要谨慎使用memset。

class BaseParameters
{
public:
virtual void reset() {}
};

class MyParameters : public BaseParameters
{
public:
int data[3];
int buf[3];
};

MyParameters my_pars;
memset(&my_pars, 0, sizeof(my_pars));
BaseParameters* pars = &my_pars;

//…

MyParameters* my = dynamic_cast<MyParameters*>(pars);
程序运行到dynamic_cast时发生异常。原因其实也很容易发现,我们的目的是为了初始化数据结构MyParameters里的data和buf,正常来说需要初始化的内存空间是sizeof(int) * 3 * 2 = 24字节,但是使用memset直接初始化MyParameters类型的数据结构时,sizeof(my_pars)却是28字节,因为为了实现多态机制,C++对有虚函数的对象会包含一个指向虚函数表(V-Table)的指针,当使用memset时,会把该虚函数表的指针也初始化为0,而dynamic_cast也使用RTTI技术,运行时会使用到V-Table,可此时由于与V-Table的链接已经被破坏,导致程序发生异常。

2️⃣C++中memset函数的用法


//复习数组的时候,第一次见到了memset,学之。

memset:char型初始化函数

头文件:<string.h> 或 <memory.h>

函数原型:void *memset(void *s , int ch , size_t  n )

memset(结构体/数组名 , 用于替换的ASCII码对应字符 , 前n个字符 );

memset(结构体/数组名 , "用于替换的字符“ , 前n个字符 );

函数解释:将s中的前n个字节用ch替换并且返回s

函数作用:在一段内存块中填充某一个给定的值,常用于较大的对结构体和数组的清零操作。

实例:

1.

#include<iostream>
//#include"string.h"
using namespace std;
int main()
{
    char str[10];
    str[9] = 'w';
    memset(str,97,9);
    for(int i=0;i<10;i++){
        cout<<str[i]<<" ";
    }
    return 0;

输出:a a a a a a a a a w

说明:使用memset似乎不需要使用额外的头文件。

2.

#include<iostream>
//#include"string.h"
using namespace std;
int main()
{
    char str[10];
    str[9] = 'w';
    memset(str,97,sizeof(char)*10);
    for(int i=0;i<10;i++){
        cout<<str[i]<<" ";
    }
    return 0;

输出:a a a a a a a a a a

 

3.

#include<iostream>
using namespace std;
int main()
{
    char str[10];
    memset(str,65,sizeof(str)-3);
    for(int i=0;i<10;i++){
        cout<<str[i]<<" ";
    } 
    return 0;
}

输出:A A A A A A A 

 

3️⃣memset

memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。

函数介绍 #include<string.h>void *memset(void *s, int ch, size_t n);

memset解释:将s中当前位置后面的n个字节用ch替换并返回s。

memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 。

memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度。

函数作用

1,memset() 函数常用于内存空间初始化。

2,memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化

例如:memset(a,’’,sizeof(a));

3,memset可以方便的清空一个结构类型的变量或数组。

如:

struct sample_struct{ char csName[16]; int iSeq; int iType;};

对于变量

struct sample_strcut stTest;

一般情况下,清空stTest的方法:

stTest.csName[0]={''};stTest.iSeq=0;stTest.iType=0;

用memset就非常方便:

memset(&stTest,0,sizeof(sample_struct));

如果是数组:

struct sample_struct TEST[10];

memset(TEST,0,sizeof(struct sample_struct)*10);

此外:如果结构体中有数组的话还是需要对数组单独进行初始化处理的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。