关于memset函数初始化数组的“坑”

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/melody_1016/article/details/83479778

我们知道,memset函数可以用来把一整块内存全部初始化,一般常用于数组。请看下面的代码

我们定义了一个大小为5的int型数组,意在把数组中的每一个元素都初始化为1。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//初始化
void InitArry(int arr[], int size)
{
	memset(arr, 1, sizeof(arr[0]) * size);
}
//打印
void PrintArry(int arr[], int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
}

int main()
{
	int a[5];
	int _size = sizeof(a) / sizeof(a[0]);
	InitArry(a, _size);
	PrintArry(a, _size);
	system("pause");
	return 0;
}

运行结果:

由输出结果可以看到,并没有把数组中的每一个元素都初始化为1。这是为什么?这里就要着重分析一下memset函数的作用了。

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.要设置的值。 该值作为int传递,但该函数使用此值的unsigned char转换填充内存块。
NUM

num

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

Return Value

ptr is returned.

可以看到,memset函数的作用是把一整块内存区域全部填充为某个特定的值,填充的时候是一个字节一个字节进行填充的。

这里的数组是整型数组,我们想把数组中的每一个元素都初始化为1,而1是int类型,占4个字节。因为填充的时候会按照是unsigned char进行填充,所以取出的是1的四个字节中的最低位,然后数组中的每一个字节都按照这样填充。这也就解释了为什么输出结果不是1。图解如下:

 调用监视窗口查看

但是,我们经常memset(arr,0,siezeof(arr)/sizeof(arr[0]),即把块内存全部初始化为0往往用memset这种方法。为什么可行呢?通过调用内存的方式不难发现


总结:综上,在使用memset函数时,一定要注意它是按照字节进行初始化元素的,如果我们想把int arr[5]={1,1,1,1,1},要采用for循环遍历初始化的方式。

猜你喜欢

转载自blog.csdn.net/melody_1016/article/details/83479778