[英]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
在堆上聲明數組,或者創建一個靜態常量等。
編輯2:我設法找到一個描述此問題的SO問題: C ++函數中靜態變量的生存期是多少?
在C / C ++中,函數不能將數組聲明為返回類型。
例如在C標准中
6.7.6.3函數聲明符(包括原型)約束1函數聲明符不得指定作為函數類型或數組類型的返回類型。
對於您的代碼,它具有未定義的行為,因為該函數返回指向具有數組類型的本地對象的指針。 退出函數后,數組將被銷毀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.