Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc()调用后的双重释放或损坏(faststop)_C - Fatal编程技术网

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()。或者从结构的元素中释放内存就足够了?可能是