[英]Address behaviour with dynamic memory allocation in C
我編寫了以下兩個代碼,並分別給出了它們的輸出。
代碼1:
#include<stdio.h>
int* allocate(int array, int value)
{
int k[array];
//int *k=(int *)malloc(array*sizeof(int));
for(int i=0;i<array;i++)
{
k[i]=value;
printf("%d ",k[i]);
}
printf("\n");
return k;
}
int main(void)
{
int *p=allocate(3,25);
for(int i=0;i<3;i++)
printf("%d ",p);
return 0;
}
輸出:
25 25 25
0 0 0
代碼2:
#include<stdio.h>
int* allocate(int array, int value)
{
//int k[array];
int *k=(int *)malloc(array*sizeof(int));
for(int i=0;i<array;i++)
{
k[i]=value;
printf("%d ",k[i]);
}
printf("\n");
return k;
}
int main(void)
{
int *p=allocate(3,25);
for(int i=0;i<3;i++)
printf("%d ",p);
return 0;
}
輸出:
25 25 25
12329552 12329552 12329552
我知道在第一個代碼中,數據是在堆棧中分配的,一旦執行return語句,編譯器將清除它們。 但是我只是打印'p'而不是'* p'。 為什么顯示0? 畢竟,指針* p在main()中聲明。
請簡單地解釋一下。 提前致謝。
編輯1:我正在添加一個新代碼,以使我的問題清楚。 代碼3:
#include<stdio.h>
int* allocateArray(int size, int value)
{
int arr[size];
for(int i=0; i<size; i++) {
arr[i] = value;
}
return arr;
}
int main(void)
{
int* vector = allocateArray(5,45);
for(int i=0; i<5; i++) {
printf("%d\t", &vector[i]);
}
return 0;
}
輸出:
0 4 8 12 16
在第三段代碼中,我無法打印vector [i]或*(vector + i)。 編譯器終止程序。
我只需要解釋0和第三代碼輸出中的模式。
在您的答案中,您解釋說,您了解到,您正在返回一個指向allocate
數組的指針,該數組在allocate
指針分配給main
p
之前就不存在了,並且想知道為什么會出現空指針而不是“現實”指針例如,堆棧指針。
NULL
? 如注釋中所述,編譯器還知道在檢查該指針時該指針將無效,因此由於以下規則,它可以返回空指針:
根據ISO / IEC 9899:2011第6.2.4節 :
當指針所指向的對象(或剛過去的對象)達到其生命周期的終點時,指針的值將變得不確定 。
通過不確定,這意味着該指針的值將是未指定的或潛在的陷阱表示形式 (如果通過任何操作讀取,則將導致未定義的行為),這意味着可以返回空指針以及指向另一個現有指針的指針。對象,沒有對象的指針以及可能導致程序崩潰或意外行為的指針值。
NULL
? 至於為什么編譯器實現決定使用null指針,可能是因為它是一個不可能悄無聲息地中斷程序的選擇。 編譯器通常不會影響性能,從而使您免於自己的煩惱,但是在這里,完全可以自由地優化前面的大部分功能,只需返回一個空指針,該指針在典型的托管環境中(如果被取消引用)將立即導致段錯誤,而不是通過嘗試使用“已分配”數組來允許覆蓋內存中的其他對象的可能性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.