怎么用memset清空字符数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用memset清空字符数组?相关的知识,希望对你有一定的参考价值。

假如a[]="I love China",如何用menset来清空a 。 (是清空不是清零) 是用:memset(a, 0, sizeof(a)); 还是:memset(a, '\0', sizeof(a)); 还有a[0]='\0' ,可以清空a吗? 谢谢!

参考技术A 用memset(a,0,strlen(a));
//strlen(a)检测字符串长度
a[0]='\0';
不能清空,仅是把第0个元素置为'\0',用printf输出为空而已。
参考技术B 所谓清空数组,是要清空每个元素;清空字符串是将字符串置为空,这两个要求有异。
清空数组:char
a[100];
int
i;
for
(
i=0;i<100;i++
)
a[i]=0;
清空字符串:char
a[100];
a[0]=0;
//或a[0]='\0';
因为字符串以0结束,你只要将字符串数组第1个字符设置为0值即算清空了字符串。
存放字符串的
字符数组
就是你说的字符串数组,只不过说明这个字符型数组是用于存放字符串的而已,官方可没有这个说法,只要字符型数组一说。
参考技术C memset是设置内存的值,memset(a,
0,
sizeof(a))就是将数组a的每个位置都设置为0,相当于循环的a[i]='0',memset(a,
'\0',
sizeof(a))可以算是清空,因为所有的c字符串都是以'\0'结尾的,设置成了'\0'也就相当于清空了。
a[0]='\0'可以清空a,你可以设置后,调用strlen(a)看看长度是多少啊

拒绝手滑,我们都是稳准狠C++のmemset函数的小探究

引子

我们使用经常使用memset函数来初始化一些数据结构,常见的字符串数组、结构体、结构体数组。今天我要提出的是一个关于指针的初始化的小问题,很容易手滑写错了。
强调一下错误示例,直接用指针来memset是不对的,并不能清空指针:
void* p1 = &x;memset(p1, 0, sizeof(p1));
所以我们为了避免memset手滑导致的错误,经常会自己封装一下memset函数,如“mzero(a)”宏所示,方便大家准确地使用。

使用memset函数清空指针的demo如下:
code:

#include <iostream>
#include <cstring>

using namespace std;

//定义赋初值为0
#define mzero( a ) \\
{ \\
	memset( &a, 0x00, sizeof(a)); \\
}

int main() {
    int x=10;

    void* pNull = NULL;
    cout << "NULL ptr is:" << pNull << endl;
    cout << "x ptr is :" << &x << endl;
    cout << endl;
    
    
    void* p1 = &x;
    cout << "p1 ptr is:" << p1 << endl;

    memset(p1, 0, sizeof(p1));
    cout << "memset p : " << p1 << endl;
        
    cout << endl;
    
    void* p2 = &x;
    cout << "p2 ptr is:" << p2 << endl;
    
    memset(&p2, 0, sizeof(p2));
    cout << "memset &p ptr: " << p2 << endl;
    
    cout << endl;
    
    void* p3 = &x;
    cout << "p3 ptr is:" << p3 << endl;
    
    mzero(p3);
    cout << "mzero p: " << p3 << endl;
}

output:

NULL ptr is:0
x ptr is :0x7fff671fb2d4

p1 ptr is:0x7fff671fb2d4
memset p : 0x7fff671fb2d4

p2 ptr is:0x7fff671fb2d4
memset &p ptr: 0

p3 ptr is:0x7fff671fb2d4
mzero p: 0

正文

其实以上问题已经转化为memset初始化指针问题了。首先给出结论:
指针使用NULL赋值,值数据使用memset设为0。
虽然我们demo里memset方法和NULL方法从结果上看都初始化为0了,但是还是不建议使用memset来初始化指针。因为有些系统存在着“非零空指针”(某些 Honeywell-Bull 大型机使用比特模式 06000 作为 (内部的) 空指针),这时memset就不适用这种情况了。所以我们应该:
• 用空指针常量(或空指针)对指针变量初始化;
例如:int *p = NULL; int *p = 0;
• 用空指针常量(或空指针)对指针变量赋值;
例如:int i =222;int *p = &i;

官方文献

追根溯源,打破沙锅问到底。

memset

void * memset ( void * ptr, int value, size_t num );

Fill block of memory
Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).

Parameters

ptr:
Pointer to the block of memory to fill.

value:
Value to be set. The value is passed as an int, but the function fills the block of memory using the unsigned char conversion of this value.

num:
Number of bytes to be set to the value.
size_t is an unsigned integral type.

Return Value

ptr is returned.

旁征博引

https://www.cplusplus.com/reference/cstring/memset/
https://www.maixj.net/ict/memset-24260
http://c-faq-chn.sourceforge.net/ccfaq/node73.html

以上是关于怎么用memset清空字符数组?的主要内容,如果未能解决你的问题,请参考以下文章

memset清空指针是怎么用的?

c语言中怎么把一个数组清空

在c++中怎么用memset() 给二维char型数组赋值

C语言中 如何把字符串中某一位清空?

memset()函数及其作用

c语言如果用字符串类型输出字符数组,字符数组最后一个是0,那么为啥会出现乱码