C内存泄漏传递参数?

C内存泄漏传递参数?,c,gcc,memory-leaks,C,Gcc,Memory Leaks,因此,我的gcc编译器说: ================================================================= ==831==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60c000001d3c at pc 0x7fcb29c87075 bp 0x7ffe0bf63e70 sp 0x7ffe0bf635e8 READ of size 121 at 0x60c000001d3c

因此,我的gcc编译器说:

=================================================================
==831==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x60c000001d3c at pc 0x7fcb29c87075 bp 0x7ffe0bf63e70 sp 0x7ffe0bf635e8
READ of size 121 at 0x60c000001d3c thread T0

我将char*list=argv[1]传递给函数。这可能是原因吗?

您多次关闭文件

for (int i = 1; i < sl->count; i++)
{
    if (sl->stadt[i]->stadtId != s->stadtId)
    {
        s1 = sl->stadt[i];
        fprintf(file, "%d %s %d \n", sl->stadt[i]->stadtId, sl->stadt[i]->name, sl->stadt[i]->gebietId);
    }
fclose(file); // Being called several times on the loop!
} 
for(int i=1;icount;i++)
{
如果(sl->stadt[i]->stadtId!=s->stadtId)
{
s1=sl->stadt[i];
fprintf(文件,“%d%s%d\n”,sl->stadt[i]->stadtId,sl->stadt[i]->名称,sl->stadt[i]->gebietId);
}
fclose(file);//在循环中被多次调用!
} 
正如您所看到的,fclose(文件)在for循环中,从我所看到的,它被调用了好几次,这可能是导致问题的原因

您可以做什么: 如果要在文件中打印后关闭文件,可以将fclose(文件)放在if语句中,并按如下方式中断循环:

for (int i = 1; i < sl->count; i++)
{
    if (sl->stadt[i]->stadtId != s->stadtId)
    {
        s1 = sl->stadt[i];
        fprintf(file, "%d %s %d \n", sl->stadt[i]->stadtId, sl->stadt[i]->name, sl->stadt[i]->gebietId);
        fclose(file);
        break;
    }
}
for (int i = 1; i < sl->count; i++)
{
    if (sl->stadt[i]->stadtId != s->stadtId)
    {
        s1 = sl->stadt[i];
        fprintf(file, "%d %s %d \n", sl->stadt[i]->stadtId, sl->stadt[i]->name, sl->stadt[i]->gebietId);
    }
}
fclose(file);
for(int i=1;icount;i++)
{
如果(sl->stadt[i]->stadtId!=s->stadtId)
{
s1=sl->stadt[i];
fprintf(文件,“%d%s%d\n”,sl->stadt[i]->stadtId,sl->stadt[i]->名称,sl->stadt[i]->gebietId);
fclose(文件);
打破
}
}
如果多次调用print,只需将fclose(文件)移出for循环,如下所示:

for (int i = 1; i < sl->count; i++)
{
    if (sl->stadt[i]->stadtId != s->stadtId)
    {
        s1 = sl->stadt[i];
        fprintf(file, "%d %s %d \n", sl->stadt[i]->stadtId, sl->stadt[i]->name, sl->stadt[i]->gebietId);
        fclose(file);
        break;
    }
}
for (int i = 1; i < sl->count; i++)
{
    if (sl->stadt[i]->stadtId != s->stadtId)
    {
        s1 = sl->stadt[i];
        fprintf(file, "%d %s %d \n", sl->stadt[i]->stadtId, sl->stadt[i]->name, sl->stadt[i]->gebietId);
    }
}
fclose(file);
for(int i=1;icount;i++)
{
如果(sl->stadt[i]->stadtId!=s->stadtId)
{
s1=sl->stadt[i];
fprintf(文件,“%d%s%d\n”,sl->stadt[i]->stadtId,sl->stadt[i]->名称,sl->stadt[i]->gebietId);
}
}
fclose(文件);

消毒剂显示缓冲区溢出,而不是内存泄漏。顺便说一句,有两个变量名为
sl
s1
,可能会造成混淆。
s1
WriteAfterMathData
中从未使用过。缩进与大括号
{
..
}
不匹配。这是您的真实代码还是您意外删除了一个大括号?在不知道结构定义、如何分配内存以及向函数传递什么的情况下,很难找出问题所在。@blastfull,那么我应该看看哪里?我通过char*name=argv[4]在main中读取一个动态值;并将其作为参数传递给RemoveCity。你认为这可能会导致这种情况吗?至于其他人:fclose在迭代之外,但由于某些原因,我无法编辑我的帖子(它说它现在主要包含代码)。s1仅用于调试目的。您可能正在读取/写入超过数组结尾的内容,或者您的指针无效。我会在调试器中运行代码,在
fprintf
处设置断点,然后查看变量。