gpt4 book ai didi

arrays - 程序中的C内存泄漏

转载 作者:行者123 更新时间:2023-12-04 17:22:58 25 4
gpt4 key购买 nike

我需要关于程序中我没有释放分配的内存的建议。在我看来,它在评论部分的某个地方,在这种形式中是为了编译我。
在这里,以某种方式,我处理内存并尝试释放它。
写信时free(diagonaly);在 if(nr<=0 ) 中抛出一个错误。
这个条件在对角线diagonaly = (char**) malloc(sizeof(*diagonaly)*rDiagonaly)的时刻满足已分配,但未分配任何行。

int main (void)
{
char **diagonaly;
char **docasne;
int rDiagonaly = 10;
int cDiagonaly = -1;

char *str = NULL;
size_t capacity = 0;
int first = 1;
int nr = 0;

printf("Vypln:\n");
while ( getline (&str, &capacity, stdin) != -1)
{
if(str[0] == '\n')
break;
//valid control
if ( !validni(str, cDiagonaly) )
{
printf("Nespravny vstup.\n");
for (int i = 0; i < nr; i++)
free (diagonaly[i]);
free(diagonaly);
free(str);
return 0;
}

if (first)
{
cDiagonaly = strlen (str)+1;
diagonaly = (char**) malloc(sizeof(*diagonaly)*rDiagonaly);
first = 0;
}

if (nr==rDiagonaly)
{
rDiagonaly *= 2;
docasne = (char**)realloc (diagonaly, rDiagonaly*sizeof(*diagonaly));
diagonaly=docasne;
}

diagonaly[nr]=(char*) malloc (cDiagonaly*sizeof(**diagonaly));
strcpy(diagonaly[nr],str);

nr++;

}

if(nr<=0 )
{
printf("Nespravny vstup.\n");
free(str);
//free (diagonaly[0]);
//free(diagonaly);
return 0;
return 0;
}

rDiagonaly = nr;
char **maska;
int rMaska = nr+1;
int cMaska = cDiagonaly+1;
str = NULL;
capacity = 0;


nr=0;

maska=(char**)malloc (rMaska*sizeof(*maska));
for (int i = 0; i < rMaska; i++)
maska[i]=(char *) malloc (cMaska*sizeof(**maska));

printf("Maska:\n");
while ( getline (&str, &capacity, stdin) != -1)
{

if(nr == rMaska)
{
printf("Nespravny vstup.\n");

for (int i = 0; i < rDiagonaly; i++)
free (diagonaly[i]);
free(diagonaly);

for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
free(str);


return 0;
}
//valid control
if ( validniM(str, cMaska) )
{
strcpy(maska[nr],str);
}
else
{
printf("Nespravny vstup.\n");
for (int i = 0; i < rDiagonaly; i++)
free (diagonaly[i]);
free(diagonaly);

for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
free(str);
return 0;
}
nr++;
}

if (nr != rMaska)
{
printf("Nespravny vstup.\n");
for (int i = 0; i < rDiagonaly; i++)
free (diagonaly[i]);
free(diagonaly);

for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
free(str);
return 0;
}


for (int i = 0; i < rDiagonaly; i++)
free (diagonaly[i]);
free(diagonaly);

for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
free(str);
}

最佳答案

我很确定这个答案永远不会被阅读,但无论如何......
问题是你没有初始化 diagonaly .所以如果你提供一个空行作为你的第一行,它将指向内存中的一个随机位置和 free()可能会导致您的程序崩溃。
解决方案是记住初始化你的指针:

char **diagonaly = NULL;
当然,你不应该做 free(diagonaly[0]) , 因为 nr0 , 意味着取消引用 diagonally是错的。

关于arrays - 程序中的C内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65061744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com