[英]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,您的指針具有隨機值。 該值指向具有隨機值的另一個位置。 然后您取消引用第二個。 因此,如果這些隨機值指向分配給程序的內存中的位置,則不會進行段錯誤。 如果沒有,它將出現段錯誤。
為什么打印0
和10
? 因為在這種情況下,編譯器已經優化了所有指針操作,並假定未初始化的指針為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.