簡體   English   中英

無法通過指針從函數返回3d數組

[英]Unable to return a 3d array from function through pointers

我有一個函數,該函數返回整數的3-d數組作為指向其中第0個2-D數組的第0個1-D數組的指針。 它的尺寸為2*3*4 這是我的功能:

    int (*ultimate())[4] {
        int a[2][3][4] = {
                {
                        {1,2,3,4},
                        {5,6,7,8},
                        {9,10,11,12}
                },
                {
                        {13,14,15,16},
                        {17,18,19,20},
                        {21,22,23,24}
                }
        };
        return (int (*)[4]) a;
    }

我以兩種不同的方式使用此功能:

在第一種方法中,我將指針指向一維數組,並看到有6個這樣的數組,逐個打印出每個數組:

int (*q)[4];
q = ultimate();
for (int i = 0; i < 2*3; i++) {
    printf("\n");
    for (int k = 0; k < 4; k++) {
        printf("%d ",*(*(q+i)+k));
    }
}

在下一個方法中,我只是使用返回值來獲取3-D數組中第一個元素的地址,然后打印所有內容:

int *p;
    for (int i = 0; i < 2; i++) {
        p = (int *) (q+i*3);
        pnl();
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 4; k++) {
                printf("%d",*p);
                p++;
            }
        }
    }

但是,在兩種情況下,我都得到了垃圾值。 在第一種方法中,我得到了數組的某些行,而其他值都是垃圾,而在第二種方法中,所有值都是垃圾。 知道我錯了嗎?

您正在堆棧中的函數內部創建數組。 函數退出時,將回收該內存。 因此,不能保證您將能夠訪問這些值。

您獲得隨機正確值的原因是由於偶然,該內存區域尚未被覆蓋。 為了避免這種情況,請使用malloc在堆上聲明數組,或者創建一個靜態常量等。


編輯:靜態常量是指函數外部的全局常量。 從技術上講,函數內部的靜態變量的生存期等於程序的生存期。 但是由於C規范不能保證線程安全,因此在關閉程序時可能會出現潛在的錯誤。

編輯2:我設法找到一個描述此問題的SO問題: C ++函數中靜態變量的生存期是多少?

在C / C ++中,函數不能將數組聲明為返回類型。

例如在C標准中

6.7.6.3函數聲明符(包括原型)約束1函數聲明符不得指定作為函數類型或數組類型的返回類型。

對於您的代碼,它具有未定義的行為,因為該函數返回指向具有數組類型的本地對象的指針。 退出函數后,數組將被銷毀。

暫無
暫無

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

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