簡體   English   中英

C-自由功能崩潰

[英]C - free function crashes

我嘗試檢查地址及其所有外觀是否正常,打印是否正常,以及其他所有功能是否正常。 但是,當它嘗試釋放內存時,程序崩潰。 碼:

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

我有什么想念的嗎?

當使用指針和動態分配時,分配的內存很可能不是連續的,但是每次分配都會獲得單獨的內存區域。 這意味着當您將其視為函數中的一個大連續內存區域時,您會表現出不確定的行為

實際的數組,例如

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

現在將是連續的。

有關數組的數組與指針的指針之間的區別的更多“圖形”解釋,請參見例如我的舊答案

這段代碼的索引范圍非常嚴格。 分配給pppArr的內存具有三個間接級別。 它不是多維數組(即,不是數組的數組),而是指向指針數組的指針。 間接的三個層次。 有6個獨立的float切片,每個切片都有2個連續的元素(即THIRD_DIM )。

當調用getNumssortArrprintArr ,你逝去的**pppArr 這等效於傳遞pppArr[0][0] ,它指向單個2元素float值序列。 這些函數只能訪問THIRD_DIM元素,即2。相反,它們試圖訪問12個元素(即TOTAL ),這當然會破壞內存並導致未定義的行為。

據我所知,您似乎正在嘗試以單個一維數組的形式訪問存儲。 如果是這樣,那么修復它的最簡單方法是消除2個間接級別,並擺脫FIRST_DIMSECOND_DIMTHIRD_DIM ,只分配一個帶有LENGTH元素的平面數組。 指針的類型為float *

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM