簡體   English   中英

在C中,如果將雙指針分配給值,為什么指針變量為0?

[英]In C if double pointer is assigned to value, why is the pointer variable 0?

int main() 
{
    int var = 10;
    int **ptr;

    **ptr = var;

    printf("%x\n",ptr);
    printf("%d\n",**ptr);

    return 0;
} 

上面的代碼打印:0和10

為什么ptr 0?

如果ptr為0,代碼如何顯示** ptr = 10?

我嘗試打印* ptr。

這產生了分段錯誤(因為ptr為0)。

那么,為什么不在** ptr處引發分段錯誤呢?

可能與編譯器有關嗎?

PS:我正在使用https://www.onlinegdb.com/online_c_compiler來運行此代碼。

指針ptr未初始化。 您的代碼將調用未定義的行為,因為您要取消引用未初始化的指針。

您將指針分配給指針本身,而不是所引用的對象。

int v = 10;

int *ptr = &v;
int **ptrptr = &ptr;

printf("%d\n", **ptrptr);

那么,為什么不在** ptr處引發分段錯誤呢?

通過事件。 這是UB,您的指針具有隨機值。 該值指向具有隨機值的另一個位置。 然后您取消引用第二個。 因此,如果這些隨機值指向分配給程序的內存中的位置,則不會進行段錯誤。 如果沒有,它將出現段錯誤。

為什么打印010 因為在這種情況下,編譯器已經優化了所有指針操作,並假定未初始化的指針為NULL,所以只需打印常量值即可:

main:
        push    {r4, lr}
        mov     r1, #0
        ldr     r0, .L3
        bl      printf
        mov     r1, #10
        ldr     r0, .L3+4
        bl      printf
        mov     r0, #0
        pop     {r4, pc}
.L3:
        .word   .LC0
        .word   .LC1
.LC0:
        .ascii  "%x\012\000"
.LC1:
        .ascii  "%d\012\000"

暫無
暫無

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

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