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];
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!?
ý 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.
Chắc thầy cô sợ access out of bound làm hư chương trình chấm bài
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);
vì 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
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
Không để ý nó kiểu int
, trong đầu lại nghĩ đến char
.