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
#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]
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]
c_strA:
********** minh hoang blog!
********** minh hoang blog!
********** minh hoang blog!
c_bufA:
AB777FGHIJK
AB777FGHIJK
AB777FGHIJK