使用 memset() 并解释函数的 size_t 名称

Using the memset() and interpreting the size_t num of the funciton

我正在尝试破译使用 memset() 的代码块。以下是我要破译的内容。

memset(buffer, 0, strlen(argv[1]) - 4);

根据我对memset函数的理解,就是将"buffer"的内存块填充为“0”的值和return[=13]中存储的字符串的大小=].谁能解释一下 argv[1] -4

我明白 argv[1] 是第一个要设置到缓冲区中的数组。

我使用了来自 this 网站的资源。

argv 是传递给 main 函数的参数(或更准确地说是字符串序列),在调用程序时定义。

通常 main 函数的形式为:

int main (int argc, char* argv[])

其中 argc - 输入参数的数量。

man page 开始,memset() 的语法是

void *memset(void *s, int c, size_t n);

对应的描述为

The memset() function fills the first n bytes of the memory area pointed to by s with the constant byte c.

所以,根据代码,

memset(buffer, 0, strlen(argv[1]) - 4);

memset function, it is to fill the block of memory of "buffer"

with the value of "0"

没错。不过,它是 0,而不是 "0"

and return the size of the string stored in "argv[1] -4 "

没有。 memset() 的第三个参数是 要填充的内存大小或数量(以字节为单位) 作为第二个提供的值参数。

为了清晰和可读性,我们可以重写如下

memset( buffer , 0 , (strlen(argv[1]) - 4) );

也就是说,strlen(argv[1]) - 4 给出 argv[1] 所持有的字符串的 长度 ,减去 4。正如我的 @Paul R 先生非常正确地建议的那样,这个逻辑很可能用于表示文件名 没有 扩展名/后缀(省略最后 4 chars 输入字符串)。

最有可能初始化一个缓冲区来保存类似删除后缀的文件名之类的东西,例如如果程序被调用为:

my_program my_filename.txt

然后 argv[1] 包含字符串 "my_filename.txt"。因此 strlen(argv[1]) - 4 将是 15 - 4 = 11,即足够的字符来容纳字符串 "my_filename"(没有终止字符)。

argv[1] 是我们在执行程序时输入的值(命令行参数)。代码中的 memset()buffer 设置为 0 直到 argv[1]-4 到达。 IE。如果你提供 10 然后 10-4=6 ,缓冲区将被设置为 0 6 字节