如果你在 shell 上输入 man memset,它会告诉你
void * memset(void *b, int c, size_t len)
对此的简单英文解释是,它填充一个长度为len 的字节字符串b,每个字节都有一个值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
-
float 类型 --> 0.0f
-
double 类型 --> 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 委员会并没有强加这样的定义,它是特定于编译器的。