malloc()调用后的双重释放或损坏(faststop)
我有一个小程序来动态分配指针数组,这样用户就可以随时输入字符数组。我用灵活的指针数组创建了一个结构。问题是当我尝试从malloc()调用后的双重释放或损坏(faststop),c,C,我有一个小程序来动态分配指针数组,这样用户就可以随时输入字符数组。我用灵活的指针数组创建了一个结构。问题是当我尝试从malloc调用free(arrayPtr)和free(arrayPtr->str[I])时。它给我错误双重免费或损坏(faststop)。但是当我把它们拿出来的时候。这个程序运行得很好,但我还是不明白为什么。幕后发生了什么?在这种情况下,我不应该使用free() #include <stdio.h> #include <stdlib.h> #include
malloc
调用free(arrayPtr)
和free(arrayPtr->str[I])
时。它给我错误双重免费或损坏(faststop)。但是当我把它们拿出来的时候。这个程序运行得很好,但我还是不明白为什么。幕后发生了什么?在这种情况下,我不应该使用free()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
/* Get num */
char *getNum()
{
char *_new, *num, c;
int i;
num = malloc(sizeof(char));
for (i = 0; (c = getchar()) != EOF && c != '\n'; i++)
{
_new = realloc(num, i + 2);
num = _new;
num[i] = c;
}
if (c == '\n')
num[i] = '\0';
num[i] = '\0';
return num;
}
struct strHolder {
int size;
char *str[];
};
// Main
int main()
{
char *longNum;
unsigned i = 0;
struct strHolder *arrayPtr = malloc(sizeof (struct strHolder));
for (i = 0; i < 6; i++)
arrayPtr -> str[i] = malloc(sizeof (arrayPtr -> str[i]));
i = 0;
while (i < 6) {
printf("Enter %u number: ", i + 1);
longNum = getNum();
arrayPtr -> str[i++] = longNum;
}
for (i = 0; i < 6; i++)
printf("\nnum is >> %s\n", arrayPtr -> str[i]);
for (i = 0; i < 6; i++)
free(arrayPtr -> str[i]);
free(longNum);
free(arrayPtr);
return 0;
}
#包括
#包括
#包括
#包括
#包括
/*获取num*/
char*getNum()
{
char*_new,*num,c;
int i;
num=malloc(sizeof(char));
对于(i=0;(c=getchar())!=EOF&&c!='\n';i++)
{
_新=realloc(num,i+2);
num=_new;
num[i]=c;
}
如果(c=='\n')
num[i]='\0';
num[i]='\0';
返回num;
}
struct strHolder{
整数大小;
char*str[];
};
//主要
int main()
{
char*longNum;
无符号i=0;
struct strHolder*arrayPtr=malloc(sizeof(struct strHolder));
对于(i=0;i<6;i++)
arrayPtr->str[i]=malloc(sizeof(arrayPtr->str[i]);
i=0;
而(i<6){
printf(“输入%u编号:”,i+1);
longNum=getNum();
arrayPtr->str[i++]=longNum;
}
对于(i=0;i<6;i++)
printf(“\nnum是>>%s\n”,arrayPtr->str[i]);
对于(i=0;i<6;i++)
免费(arrayPtr->str[i]);
自由(长);
免费(Arrayptor);
返回0;
}
将从getNum()
获得的指针分配给longNum
和数组元素。在函数的末尾,对所有数组元素调用free()
,包括包含从getNum()
获得的指针的数组元素
到目前为止,这还可以,但是您另外调用了free(longNum)
,试图再次释放内存。在相应的数组元素上调用free()
时,它已经被释放
此外,还有内存泄漏:如果数组中的原始指针被getNum()
中的新指针覆盖,则它们永远不会被赋予free()
。所以他们引用的内存丢失了。这可以通过调用free(arrayPtr->str[i])
来避免,然后再分配由getNum()
返回的新指针
free(arrayPtr -> str[i]);
释放了一个指针,该指针已分配给该指针行中的另一个指针
arrayPtr -> str[i++] = longNum;
然后在第行中再次释放同一指针
free(longNum);
那么我也需要从struct中释放内存吗?因为我也为此调用malloc()。或者从结构的元素中释放内存就足够了?可能是