Если вы наберете man memset
на своей оболочке, она сообщит вам, что
void * memset(void *b, int c, size_t len)
Простое объяснение на английском языке: заполнениестрока байтов b
длины len
с каждым байтом значением c
.
Для вашего случая
memset(grid, 5, 100 * sizeof(int));
Начиная с sizeof(int)==4
, поэтому приведенные выше фрагменты кода выглядели как:
for (int i=0; i<100; i++)
grid[i]=0x05050505;
ИЛИ
char *grid2 = (char*)grid;
for (int i=0; i<100*sizeof(int); i++)
grid2[i]=0x05;
Это вывело бы 84215045
Но в большинстве кода C мы хотим инициализировать частьблок памяти с нулевым значением.
char
тип -> \0
или NUL
int
тип -> 0
- * тип 1040 * ->
0.0f
- * тип 1044 * ->
0.0
- тип указателя ->
nullptr
И gcc или clang и т. Д. Современные компиляторы могут позаботиться об этом автоматически за вас.
// variadic length array (VLA) introduced in C99
int len = 20;
char carr[len];
int iarr[len];
float farr[len];
double darr[len];
memset(carr, 0, sizeof(char)*len);
memset(iarr, 0, sizeof(int)*len);
memset(farr, 0, sizeof(float)*len);
memset(darr, 0, sizeof(double)*len);
for (int i=0; i<len; i++)
{
printf("%2d: %c\n", i, carr[i]);
printf("%2d: %i\n", i, iarr[i]);
printf("%2d: %f\n", i, farr[i]);
printf("%2d: %lf\n", i, darr[i]);
}
Но имейте в виду, C Комитет ISO не навязываеттакие определения, это зависит от компилятора.