我一直在努力弄清楚我遇到的该功能的目的。 该代码故意存在不良的代码习惯,因此我试图找出这是否是其中一种。
功能如下:
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;
}
谢谢!
答案 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_argument
为argument
分配了512个字节,然后又调用clear_mem(argument, 512)
,这清除了513个字节。最终的行为未由C代码定义。