我想如何释放一个地址由函数生成的指针的内存。我认为下面的代码解释了这种情况。
while((fgets(line,MAXLINELEN,stdin))!=NULL)
{
char *temp = format_name(strtok(line, "\n")); // format name, as posted below, allocates memory via malloc and returns a pointer
search(*dict1, temp, 0, 0, argv[2]); // this functions uses the temp above
free(temp); // this seems natural for me, but the program doesn't work properly if I do that.
}
功能:
char *format_name (char *line)
{
char *temp = malloc(sizeof(char) * (strlen(line) + 1));
*(temp + 0) = *(line + (int)strlen(line) - 1);
int i = 0;
while (*(line + i) != '\n' && *(line + i) != '\t' && i < (strlen(line) - 2))
{
*(temp + i + 1) = *(line + i);
i++;
}
return temp;
}
我知道函数创建的指针与我在第一个代码的while循环中声明的指针不同,但是因为它们(希望)指向同一个地址,我认为它应该可行。但是,如果我使用free,程序会编译并运行,但它会生成错误的输出(输出不是字符串temp)。
我做错了什么?对于这种情况,有更优雅的用法吗?
编辑:
由于上面的代码是正确的,这里是搜索功能:
void search(tree *l, char *key, int i, int n, char *filename)
{
if (*(key + 0) == '\0')
{
return;
}
if (l == NULL)
{
if (n == 0)
{
FILE *fp;
fp=fopen(filename, "a");
fprintf(fp, "%.*s\t\t%.*s\tNOTFOUND\n", ( (int)(strlen(key)) ), (key + 1), 1, key);
fclose(fp);
}
printf("%.*s\t\t%.*s\t%d\n", ((int)strlen(key) ), (key + 1), 1, (key), n );
return;
}
printf("we are comparing %s and %s\n", key, l->key);
if (strcmp(key, l->key) < 0)
{
printf("left...\n");
search(l->left, key, i + 1, n, filename);
}
else if (strcmp(key, l->key) > 0)
{
printf("right...\n");
search(l->right, key, i + 1, n, filename);
}
else
{
FILE *fp;
fp=fopen(filename, "a");
fprintf(fp, "%.*s\t\t%.*s\t%d\n", ((int)strlen(key) ), (key + 1), 1, (key), l->number );
fclose(fp);
search(l->right, key, i + 1, n + 1, filename);
}
}
预期文件(实际结果没有免费):
Andre P NOTFOUND
Crombie R 98024839
Kounovsky X 92737902
Glader R 97039865
游泳E 87039991
Fraunfelter Q 96558147
Netkowicz X 84804603
Sferra I 94137883
Vadasy J 83543659
Nguyan A 81755418
Lardner L 82266784
生成:(每次运行时它都会改变,但总有很多&#34; NOTFOUND&#34;)
Andre P找不到发票
Crombie R 98024839
Kounovsky X 92737902
Gladersky R NOTFOUND
Swimersky E NOTFOUND
Fraunfelter Q 96558147
Netkowiczer X NOTFOUND
Sferraiczer我发现了
Vadasyiczer J NOTFOUND
Nguyaniczer A NOTFOUND
Lardnerczer L NOTFOUND
答案 0 :(得分:2)
您终止在format_name
生成的字符串并非零。每次通过循环释放字符串时,每次都可能分配相同的内存区域,这意味着之前的键值仍将存储在那里。当你不释放内存时,malloc必须分配一个新的内存区域,显然你已经获得了尚未分配的内存并初始化为0。
要解决您的错误,只需在temp[i + 1] = 0;
的{{1}}语句前添加return
行。