这个clear_mem函数的目的是什么?

时间:2019-05-27 09:35:44

标签: c memory

我一直在努力弄清楚我遇到的该功能的目的。 该代码故意存在不良的代码习惯,因此我试图找出这是否是其中一种。

功能如下:

void clear_mem(char *memblock, int siz) {
  register int i;

  for (i=0; i<=siz;i++)
      *(memblock+i) = 0;

}

该函数在以下函数中调用:

char *get_argument(char line[], int argno){
    char *argument = malloc(512);
    char clone[512];
    strncpy(clone, line, strlen(line)+1);

    int current_arg = 0;
    char *splitted = strtok(clone, " ");
    while (splitted != NULL){
        if (splitted[0] != ':'){
            current_arg++;
        }
        if (current_arg == argno+1){
            clear_mem(argument, 512); //Here
            strncpy(argument, splitted, strlen(splitted)+1);
            return argument;
            free(argument);
        }
        splitted = strtok(NULL, " ");
    }

    if (current_arg != argno){
        argument[0] = '\0';
    }
    free(argument);
    return argument;
}

谢谢!

1 个答案:

答案 0 :(得分:1)

在此代码中:

for (i=0; i<=siz;i++)
      *(memblock+i) = 0;

memblock+i将整数i添加到指针memblock。结果将i个元素指向memblock所指向的位置之外。由于memblock是指向char的指针,因此结果将i个字符指向memblock所指向的位置之外。

然后*(memblock+i)引用该地址上的字符。 *(memblock+i)等同于memblock[i]*(memblock+i) = 0将该字符设置为零。

因此,此代码的作用是将循环期间由i索引的所有字符设置为零。清除内存块。

for (i=0; i<=siz;i++)使循环以i进行迭代,并从零开始到siz为止的所有值。因此,siz + 1个字符将被设置为零。

我们可以看到这是一个错误,因为get_argumentargument分配了512个字节,然后又调用clear_mem(argument, 512),这清除了513个字节。最终的行为未由C代码定义。