C - 免费功能崩溃

时间:2016-05-06 11:00:03

标签: c memory-management free allocation

我尝试检查地址及其所有看起来正常,打印工作以及其他所有工作。 但是当它试图释放内存时,程序崩溃了。 代码:

#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 个答案:

答案 0 :(得分:2)

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

实际数组,例如

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

现在 将是连续的。

参见例如this old answer of mine更多&#34;图形&#34;解释数组数组和指针指针之间的区别。

答案 1 :(得分:0)

这段代码的索引越来越严重。为pppArr分配的内存有三个间接级别。它不是多维数组(即,不是数组的数组),而是指向指针数组的指针数组的指针。三个层次的间接。有6个单独的float个切片,每个切片有2个连续的元素(即THIRD_DIM)。

在致电getNumssortArrprintArr时,您正在通过**pppArr。这相当于传递pppArr[0][0],它指向float值的单个2元素序列。这些函数只能访问THIRD_DIM元素,即2.它们试图访问12个元素(即TOTAL),这当然会破坏内存并导致未定义的行为。

据我所知,看起来您正试图将存储作为单个一维数组进行访问。如果是这样,那么解决它的最简单方法是消除2个级别的间接,并摆脱FIRST_DIMSECOND_DIMTHIRD_DIM,只需分配一个单独的平面数组LENGTH元素。指针的类型为float *