簡體   English   中英

動態分配 memory 有/無 function

[英]Dynamic memory allocation with / without function

我嘗試創建 function 為二維數組動態分配 memory 並將一些 integer 值放入數組中。 總體而言,function 按預期工作,但存在一些錯誤。 所以我在main()中做了同樣的事情並得到了正確的結果。 我的代碼如下:

#include <stdlib.h>
#include <stdio.h>

void test(int d1, int d2, int ***p){
    int value;
    *p = (int **)(malloc(sizeof(int)*d1));
    for (int i = 0; i < d1; i++){
        (*p)[i] = (int *)(malloc(sizeof(int)*d2));
        for (int j = 0; j < d2; j++){
            (*p)[i][j] = i * 10 + j;
        }
    }
    printf("\n");
}


int main(void){
    int d1, d2;
    int ** ptr;

    printf("length of 1st dimension?\n");
    scanf("%d", &d1);
    printf("length of 2nd dimension?\n");
    scanf("%d", &d2);
    test(d1, d2, &ptr);
    for (int i=0; i<d1; i++){
        for (int j=0; j<d2; j++){
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }
    free(ptr);

    ptr = (int **)(malloc(sizeof(int)*d1));
    for (int i=0; i< d1; i++){
        ptr[i] = (int *)(malloc(sizeof(int)*d2));
        for (int j=0; j<d2; j++){
            ptr[i][j] = i *10 +j;
        }
    }   

    printf("\n######################\n\n");

    for (int i=0;i<d1;i++){
        for (int j=0; j<d2;j++){
            printf("%d ", ptr[i][j]);
        }
        printf("\n");
    }
    free(ptr);

    return 0;
}`

當我將 5 作為一維和二維的長度傳遞時,我得到如下結果:

length of 1st dimension?
5
length of 2nd dimension?
5

532699424 32725 2 3 4 
10 11 12 13 14 
20 21 22 23 24 
30 31 32 33 34 
40 41 42 43 44 

######################

0 1 2 3 4 
10 11 12 13 14 
20 21 22 23 24 
30 31 32 33 34 
40 41 42 43 44 

我想,除了我將指針傳遞給指針作為參數傳遞給 function 之外,我做了同樣的事情。 但是,第一行中的某些值不同。 每當我執行 function 時,第一行都會得到不同的值。

有人可以讓我知道我做錯了什么嗎?

先感謝您。

台詞

    *p = (int **)(malloc(sizeof(int)*d1));
    ptr = (int **)(malloc(sizeof(int)*d1));

錯了。 元素是int* ,但每個元素只分配int空間。 如果int*大於int (例如,當int*是 8 個字節而int是 4 個字節時),這可能會導致問題。

線條應該是

    *p = malloc(sizeof(int*)*d1);
    ptr = malloc(sizeof(int*)*d1);

或(通過避免手動輸入來減少出錯的風險)

    *p = malloc(sizeof(*p)*d1);
    ptr = malloc(sizeof(*ptr)*d1);

另請參閱: c - 我是否投射 malloc 的結果? - 堆棧溢出

暫無
暫無

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

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