c - 释放动态分配的二维结构

标签 c dynamic-allocation

我动态分配了一个结构,在概念上与矩阵非常相似,用于保存一组字符串。我在尝试释放内存时遇到了问题。我的代码如下所示:

# 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;
}

因此该结构实际​​上包含 2 个数组,一个指向字符串的指针,另一个包含一个接一个对齐的字符串,以终止符\0 分隔。

代码运行良好,最后的 for 循环也运行良好。第一次调用免费电话也有效。问题是最后一次调用 free 失败了。 尽管试图搜索有关该问题的所有可能数据,但我发现的所有示例都考虑了这样一种情况,即保存字符串的第二个数组在 for 循环中逐步分配,然后也在 for 循环中释放.

我想避免在循环中使用动态分配,因此我的代码看起来不一样。

有人知道问题出在哪里吗?

============================================= =======================================

非常感谢所有回答我的人。最终,这个错误被解决了。问题是 dataPointersArray 在其他一些代码中填充了超过 SIZE 的元素,起初看起来是无辜的,实际上导致 free 调用失败。

再次感谢评论! 沙查尔

最佳答案

您正在分配 SIZE*255 字节,但使用 SIZE * 256 字节:

forkDS.dataArray = (char*) calloc(SIZE, 255); 
dataArrayPtr = forkDS.dataArray;   

//SIZE TIMES loop:
    dataArrayPtr = dataArrayPtr + 256; 

因此,当您将指针设为 NULL 时,您可能会覆盖由 free 正在寻找的 malloc 放置在数组末尾之后的控制数据。

关于c - 释放动态分配的二维结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6754631/

相关文章:

c - Postfix++ 运算符在 While 条件下未按预期运行

c++ - 在函数外吞下分号的宏

c - 如何从 Go 函数返回 C 指针?

c - 将接收到的、格式化的 UDP 字符数组分配给 C 中的无符号整数

c - Malloc 未定义行为 - 丢失数据

c - 光线追踪旋转

c - 在 C 中释放动态分配的二维数组

c - 在 C 中读取格式化的整数数组

c - 尝试在 C 中动态分配多维数组会导致崩溃

c - 分配指向结构的指针,但不是实际的结构