我动态地分配了一个结构,在概念上非常类似于矩阵,以保存一组字符串.我在尝试释放内存时遇到了问题.我的代码看起来像这样:
# include <stdio.h>
# include <string.h>
# include <malloc.h>
# define SIZE 2
typedef struct fork{
char** dataPointersArray;
char* dataArray;
}fork;
int main(int argc, char* argv[]){
fork forkDS;
int i;
char* dataArrayPtr;
unsigned char data[255] = "some data"; /* this is actually a function's output */
int PtrIndex;
/* allocate memory for the arrays */
forkDS.dataPointersArray = (char**) calloc(SIZE ,sizeof(char*));
if(forkDS.dataPointersArray == NULL){
printf("couldn't allocate memory \n");
}
forkDS.dataArray = (char*) calloc(SIZE, 255);
if( forkDS.dataArray == NULL){
free(forkDS.dataPointersArray);
printf("couldn't allocate memory \n");
}
dataArrayPtr = forkDS.dataArray;
for(i = 0; i < SIZE; i++){
/* update the dataPointers Array */
forkDS.dataPointersArray[i] = dataArrayPtr;
/* copy data into data array */
memcpy(dataArrayPtr,data,20);
dataArrayPtr[255] = '\0';
/* update the pointer of the data array */
dataArrayPtr = dataArrayPtr + 256;
}
for (PtrIndex = 0; PtrIndex < 2; PtrIndex++) {
if (*(forkDS.dataPointersArray + PtrIndex) != NULL) {
*(forkDS.dataPointersArray + PtrIndex) = NULL;
}
}
/* DEBUG comment - this 2 lines works */
free(forkDS.dataArray);
forkDS.dataArray = NULL;
/* DEBUG comment - the next line fails */
free(forkDS.dataPointersArray);
forkDS.dataPointersArray = NULL;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因此,该结构实际上包含2个数组,一个指向字符串的指针,另一个包含一个接一个地对齐的字符串,由终止\ 0分隔.
代码工作正常,最后的for循环也可以工作.第一次免费电话也有效.问题是最后一次免费通话失败了.虽然尝试搜索关于该问题的所有可能数据,但我发现的所有示例都考虑了这样的情况:第二个数组(包含字符串)在for循环中逐步分配,然后在for循环中释放.
我想避免在循环中使用动态分配,因此我的代码看起来不同.
有谁知道问题是什么?
================================================== ====================================
非常感谢所有回答我的人.最终,错误得到了解决.问题是dataPointersArray在其他一些代码中填充了多个SIZE元素,这些代码起初似乎是无辜的,实际上导致了免费调用失败.
再次感谢您的评论!Shachar
您正在分配SIZE*255字节,但使用SIZE*256字节:
forkDS.dataArray = (char*) calloc(SIZE, 255);
dataArrayPtr = forkDS.dataArray;
//SIZE TIMES loop:
dataArrayPtr = dataArrayPtr + 256;
Run Code Online (Sandbox Code Playgroud)
因此,当您对指针进行NULL操作时,您可能会通过freeoc正在寻找的malloc覆盖放置在数组末尾之外的控制数据.