Lập trình C/C++

Hàm memset() trong C/C++

Hàm memset() trong C/C++
Được viết bởi Minh Hoàng

Series lập trình C/C++, ngôn ngữ lập trình hệ thống mạnh mẽ.

Trong bài viết này sẽ giới thiệu ý nghĩa và cách sử dụng của hàm memset()

Cú pháp:
void* memset( void *ptr, int value, size_t num );

Trong đó:

  • ptr:là một con trỏ void trỏ tới địa chỉ bắt đầu của vùng nhớ (the block of memory) sẽ được fill giá trị value.
  • value:là một ký tự dùng để fill vào vùng nhớ. Giá trị được truyền vào là int, nhưng hàm sẽ lấp đầy vùng nhớ bằng cách sử dụng ký tự không dấu (unsigned char có kích thước 0-255) được chuyển đổi từ giá trị value này.
  • num:số byte(s) của vùng nhớ sẽ được fill giá trị value.

Hàm này sẽ trả về một con trỏ void chính là ptr.

Ý nghĩa:

– Hàm memset() sẽ set num byte(s) đầu tiên của vùng nhớ tính từ vị trí do con trỏ ptr trỏ tới bằng giá trị value.

– Thường được sử dụng để khởi tạo giá trị của một biến mảng (array), biến cấu trúc (struct),… về giá trị mặc định như 0 đối với giá trị của int, 0.0 đối với giá trị của double, ‘\0’ đối với giá trị của char,…

Ví dụ:
Sử dụng hàm memset() để khởi tạo giá trị mặc định cho biến
#include <stdio.h>
#include <memory.h>	// Khai báo để sử dụng được hàm memset, hoặc #include <wchar.h>

typedef struct _stepinfo_ {
	int			id;
	bool		is_proc;
} StepInfo;
typedef struct _csvrowinfo_ {
	wchar_t		nameA[32];
	char		c_nameA[32];
	int			numberA[5];
	double		depth;
	StepInfo	*step_infoSP;
	StepInfo	step_infoSA[260];
} CsvRowInfo;

int main()
{
	/************************/
	/*	Khai báo biến mảng	*/
	/************************/
	int			numberA[5];
	char		c_nameA[260];
	double		dbl_matrixA[4][4];

	/****************************/
	/*	Khai báo biến cấu trúc	*/
	/****************************/
	StepInfo	step_infoS;
	CsvRowInfo	csv_row_infoS;

	/*==========================================================*/
	/*	Khởi tạo giá trị cho biến mảng							*/
	/*	Có thể khởi tạo giá trị cho toàn kích thước của mảng	*/
	/*	hoặc khởi tạo giá trị theo số phần tử của mảng			*/
	/*	Do đó, có thể sử dụng 1 trong 4 cách sau:				*/
	/*==========================================================*/
	memset( numberA, 0, sizeof( numberA ) );
	memset( numberA, 0, sizeof( int )*5 );
	memset( numberA, 0, sizeof( numberA ) / sizeof( numberA[0] ) );
	memset( numberA, 0, sizeof( numberA ) / sizeof( *(numberA) ) );

	memset( c_nameA, '\0', sizeof( c_nameA ) );
	memset( c_nameA, '\0', sizeof( char )*260 );
	memset( c_nameA, '\0', sizeof( c_nameA ) / sizeof( c_nameA[0] ) );
	memset( c_nameA, '\0', sizeof( c_nameA ) / sizeof( *(c_nameA) ) );

	memset( dbl_matrixA, 0, sizeof( dbl_matrixA ) );
	memset( dbl_matrixA, 0, sizeof( double )*16 );
	memset( dbl_matrixA, 0, sizeof( dbl_matrixA ) / sizeof( dbl_matrixA[0][0] ) );
	memset( dbl_matrixA, 0, sizeof( dbl_matrixA ) / sizeof( *(dbl_matrixA[0]) ) );

	/*======================================*/
	/*	Khởi tạo giá trị cho biến cấu trúc	*/
	/*======================================*/
	memset( &step_infoS, 0, sizeof( step_infoS ) );
	memset( &csv_row_infoS, 0, sizeof( csv_row_infoS ) );
	
	return 0;
}

Sử dụng hàm memset() để set giá trị bất kỳ cho biến mảng
[code language=”c” highlight=”9,21″] #include <stdio.h>
#include <memory.h>
#include <string.h> // Khai báo để sử dụng được hàm strlen

int main()
{
// Thay thế 10 giá trị ban đầu của mảng bằng ký tự *
char c_strA[] = "welcome to minh hoang blog!";
memset( c_strA, ‘*’, 10 );

printf( "c_strA:\n%s\n", c_strA );

puts( c_strA );

for( int ii=0; ii<strlen( c_strA ); ii++ )
putchar( c_strA[ii] );
printf( "\n" );

// Thay thế 3 giá trị của mảng tính từ vị trí thứ 2 bằng ký tự 7
char c_bufA[] = "ABCDEFGHIJK";
memset( c_bufA + 2, ‘7’, 3 );

printf( "c_bufA:\n%s\n", c_bufA );

puts( c_bufA );

for( int ii=0; ii<strlen( c_bufA ); ii++ )
putchar( c_bufA[ii] );

getchar();
return 0;
}
[/code]

[code language=”c” highlight=”9,21″] #include <iostream>
using namespace std;

int main()
{
// Thay thế 10 giá trị ban đầu của mảng bằng ký tự *
char c_strA[] = "welcome to minh hoang blog!";
memset( c_strA, ‘*’, 10 );

cout << "c_strA : " << endl << c_strA << endl;

puts( c_strA );

for( int ii=0; ii<strlen( c_strA ); ii++ )
putchar( c_strA[ii] );
cout << endl;

// Thay thế 3 giá trị của mảng tính từ vị trí thứ 2 bằng ký tự 7
char c_bufA[] = "ABCDEFGHIJK";
memset( c_bufA + 2, ‘7’, 3 );

cout << "c_bufA : " << endl << c_bufA << endl;

puts( c_bufA );

for( int ii=0; ii<strlen( c_bufA ); ii++ )
putchar( c_bufA[ii] );

system("pause");
return 0;
}
[/code]

Output:

c_strA:
********** minh hoang blog!
********** minh hoang blog!
********** minh hoang blog!
c_bufA:
AB777FGHIJK
AB777FGHIJK
AB777FGHIJK

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »