Hàm memset() trong c++

mọi người giải thích giúp e dòng code này được ko ạ??

memset(dp, 0, sizeof dp);

trong đó dp là 1 mảng 2 chiều

int dp[1005][20005];
#include <stdio.h>
#include <string.h>
int main()
{
    char x[10][10][10];
    printf("%lu", sizeof x); // 10 * 10 * 10 = 1000

    return 0;
}

Tổng kích thước của các chiều của mảng.
Đoạn mã của bạn sizeof dp trả về 1005 * 20005 = 20105025.

Mà bau giờ thấy nhiều bạn thích thêm vài phần tử vào mảng nhỉ? Mảng 1000 phần tử thì khai báo thành 1005!?

1 Like

ý e muốn hỏi là công dụng của hàm memset đó trong chương trình ý :>

Thầy cô bảo là thêm vài phần tử để tránh lỗi gì đó ấy :>

Thầy cô tàm xàm quá!
Hàm memset làm đúng theo tên của nó memory set (value). Gán từng ô nhớ thành 1 giá trị nhất định.

3 Likes

Chắc thầy cô sợ access out of bound làm hư chương trình chấm bài :rofl:

2 Likes

1 int = 4 bytes = 32 bits
memset(dp, 0, sizeof dp); nó sẽ đặt từng bytes của mảng int dp[1005][20005]; thành 0

VD: số n dạng là xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx (x = 0, 1) (dạng nhị phân của n đó)

memset(dp, 0, sizeof dp); sẽ biến toàn bộ n thành 00000000 00000000 00000000 00000000
tức là = 0;

VD2: memset(dp, 60, sizeof dp);60_{10} = 00111100_2
nên toàn bộ số hạng của mảng dp sẽ bằng 00111100 00111100 00111100 00111100 = 60 \times(2^0+2^8+2^{16}+2^{24}) = 1010580540 > 10^9

VD3 : memset(dp, -1, sizeof dp); sẽ gán toàn bộ giá trị mảng = -1

2 Likes

60×(2^0+2^8+2^{16}+2^{\color{red}{24}}) nha :V Làm sao mà gán > 2^32 được :V

sizeof trả về kích cỡ bytes của dp nha :V còn phải nhân sizeof(int) nữa :V

1 Like

Không để ý nó kiểu int, trong đầu lại nghĩ đến char. :expressionless:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?