簡體   English   中英

使用C中的動態內存分配解決地址行為

[英]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.

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