C: free(): 无效指针中止(核心转储)
C: free(): invalid pointer Aborted (core dumped)
我有一个程序,我尝试在其中读取两行 40 个字符。当出现问题或程序结束时,我释放数组。
我收到一条错误消息 free():无效指针中止(核心已转储)
我觉得是上个循环的问题,但是解决不了
char *str = NULL;
size_t capacity = 0;
char **maska;
int rMaska=2, cMaska = 40;
maska =(char**)malloc (rMaska*sizeof(*maska));
for (int a = 0; a < rMaska; a++)
maska[a]=(char *) malloc (cMaska*sizeof(**maska));
i=0;
printf("Maska:\n");
while ( getline (&str, &capacity, stdin) != -1)
{
if (i==rMaska)
{
printf("incorrect entry.\n");
for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
return 0;
}
if( strlen(str) != (unsigned int) cMaska )
{
printf("incorrect entry.\n");
for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
return 0;
}
for (int i = 0; i < cMaska-1; i++)
{
if ( (str[i] != '#') && (str[i] != '.') )
{
printf("incorrect entry.\n");
for (int a = 0; a < rMaska; a++)
free (maska[a]);
free(maska);
return 0;
}
}
strcpy(maska[i], str);
i++;
}
free(str);
for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
我怀疑 while 和 for 循环中使用的 i
变量搞砸了。
我会定义一个不同的变量在 while 循环中使用(而不是 i
),事实上内部的 for 循环也使用它是非常混乱的,而且它也可能在以后产生错误。
顺便说一下,您没有释放 str
以防输入错误。
你检查你输入的字符串是否有 strlen 40,然后如果它对分配大小为 40 的数组元素执行字符串的 strcpy。但是 strcpy 也复制了尾随的 NUL,即它复制了 41人物。所以你就是,俗话说,在堆里拉屎
我有一个程序,我尝试在其中读取两行 40 个字符。当出现问题或程序结束时,我释放数组。
我收到一条错误消息 free():无效指针中止(核心已转储)
我觉得是上个循环的问题,但是解决不了
char *str = NULL;
size_t capacity = 0;
char **maska;
int rMaska=2, cMaska = 40;
maska =(char**)malloc (rMaska*sizeof(*maska));
for (int a = 0; a < rMaska; a++)
maska[a]=(char *) malloc (cMaska*sizeof(**maska));
i=0;
printf("Maska:\n");
while ( getline (&str, &capacity, stdin) != -1)
{
if (i==rMaska)
{
printf("incorrect entry.\n");
for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
return 0;
}
if( strlen(str) != (unsigned int) cMaska )
{
printf("incorrect entry.\n");
for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
return 0;
}
for (int i = 0; i < cMaska-1; i++)
{
if ( (str[i] != '#') && (str[i] != '.') )
{
printf("incorrect entry.\n");
for (int a = 0; a < rMaska; a++)
free (maska[a]);
free(maska);
return 0;
}
}
strcpy(maska[i], str);
i++;
}
free(str);
for (int i = 0; i < rMaska; i++)
free (maska[i]);
free(maska);
我怀疑 while 和 for 循环中使用的 i
变量搞砸了。
我会定义一个不同的变量在 while 循环中使用(而不是 i
),事实上内部的 for 循环也使用它是非常混乱的,而且它也可能在以后产生错误。
顺便说一下,您没有释放 str
以防输入错误。
你检查你输入的字符串是否有 strlen 40,然后如果它对分配大小为 40 的数组元素执行字符串的 strcpy。但是 strcpy 也复制了尾随的 NUL,即它复制了 41人物。所以你就是,俗话说,在堆里拉屎