代码之家  ›  专栏  ›  技术社区  ›  Administrator

C-free函数崩溃

  •  1
  • Administrator  · 技术社区  · 8 年前

    我试着检查了一下地址,一切看起来都正常,打印正常,其他一切都正常。 但当它试图释放内存时,程序就会崩溃。 代码:

    #include <stdio.h>
    #include <stdlib.h>
    #define FIRST_DIM 2
    #define SECOND_DIM 3
    #define THIRD_DIM 2
    #define TOTAL 12
    void getNums(float* pArr);
    void sortArr(float* pArr);
    void printArr(float* pArr);
    int main(void)
    {
        // Variable assignment
        unsigned int i = 0, j = 0;
        float*** pppArr = NULL;
    
        // Memory assignment
        pppArr = (float***)calloc(FIRST_DIM, sizeof(float**));
        if (!(pppArr))
        {
            printf("Failed Allocating Memory..\n");
            system("PAUSE");
            return 1;
        }
        for (i = 0; i < FIRST_DIM; i++)
        {
            *(pppArr + i) = (float**)calloc(SECOND_DIM, sizeof(float*));
            if (!(*(pppArr + i)))
            {
                printf("Failed Allocating Memory..\n");
                system("PAUSE");
                return 1;
            }
        }
        for (i = 0; i < FIRST_DIM; i++)
        {
            for (j = 0; j < SECOND_DIM; j++)
            {
                *(*(pppArr + i) + j) = (float*)calloc(THIRD_DIM, sizeof(float));
                if (!(*(*(pppArr + i) + j)))
                {
                    printf("Failed Allocating Memory..\n");
                    system("PAUSE");
                    return 1;
                }
                printf("%p && %d\n", *(*(pppArr + i) + j), **(*(pppArr + i) + j));
            }
        }
        printf("ASD");
        // Getting numbers, sorting them and printing them out
        getNums(**pppArr);
        sortArr(**pppArr);
        printArr(**pppArr);
    
        // End of program
        // Releasing memory
        for (i = 0; i < FIRST_DIM; i++)
        {
            for (j = 0; j < SECOND_DIM; j++)
            {
                free(*(*(pppArr + i) + j));
            }
        }
        for (i = 0; i < FIRST_DIM; i++)
        {
            printf("%p\n", *(pppArr + i));
            free(*(pppArr + i));
        }
        free(pppArr);
        system("pause");
        return 0;
    }
    
    /* This function gets values for the given array from the user */
    void getNums(float* pArr)
    {
        unsigned int i = 0;
        for (i = 0; i < TOTAL; i++)
        {
            printf("Enter Number %d: ", i);
            scanf("%f", pArr + i);
            getchar();
        }
    }
    
    /* This function prints out the given array */
    void printArr(float* pArr)
    {
        unsigned int i = 0;
        for (i = 0; i < TOTAL; i++)
        {
            printf("Number %d: %.2f\n", i, *(pArr + i));
        }
    }
    
    /* This function sorts the given array from lowest to highest*/
    void sortArr(float* pArr)
    {
        unsigned int i = 0, j = 0;
        float temp = 0;
        for (i = 0; i < TOTAL; i++)
        {
            for (j = 0; j < TOTAL - 1; j++)
            {
                if (*(pArr + j) > *(pArr + j + 1))
                {
                    temp = *(pArr + j);
                    *(pArr + j) = *(pArr + j + 1);
                    *(pArr + j+ 1) = temp;
                }
            }
        }
    }
    

    我有什么遗漏吗?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Community Egal    7 年前

    当您使用指针和动态分配时,您分配的内存很可能不是连续的,但您将为每个分配获得单独的内存区域。这意味着当您将其视为函数中的一个大的连续内存区域时,您将显示 未定义的行为 .

    实际数组,如

    float arr[FIRST_DIM][SECOND_DIM][THIRD_DIM];
    

    现在 那个 将是连续的。

    参见示例。 this old answer of mine 对于数组数组和指针到指针之间的差异的更“图形化”的解释。

        2
  •  0
  •   Tom Karzes    8 年前

    这段代码的索引越界现象相当严重。分配给的内存 pppArr 有三个间接级别。它不是多维数组(即不是数组数组),而是指向指向指针数组的指针数组的一个指针。三个间接级别。有6个独立的 float 切片,每个切片有2个相邻元素(即。, THIRD_DIM ).

    拨打电话时 getNums , sortArr printArr ,您正在通过 **pppArr 。这相当于通过 pppArr[0][0] ,它指向单个2元素序列 浮动 价值观功能只能访问 第三次修改 元素,即2。相反,他们试图访问12个元素(即。, TOTAL )当然,这会破坏记忆并导致不确定的行为。

    据我所知,似乎您正在尝试将存储作为单个一维阵列进行访问。如果是这样,那么修复它的最简单方法是消除2级间接寻址,并消除 FIRST_DIM , SECOND_DIM 第三次修改 ,只需使用 LENGTH 元素。指针的类型为 float * .