所以我試圖理解指標是如何作業的,尤其是結構。
這是我試圖理解的代碼
struct Node {
int val;
};
int main() {
Node* a = (Node*) malloc (sizeof(Node));
printf("%p\n", a);
printf("%p\n", &(a->val));
printf("%p\n", *a);
}
據我了解,如果我列印 a,它將列印 malloc 保留的記憶體地址。但是如果我取消參考 a,我無法弄清楚正在列印哪個記憶體。
這是輸出。
00000000001C5D40
00000000001C5D40
00000000001C0150
我希望*a取消參考第一個屬性的地址。但正如輸出所示,事實并非如此。
那么哪個記憶體被取消參考了?
uj5u.com熱心網友回復:
*a是指的struct Node那個a。printf("%p\n", *a);傳遞 的整個值struct Node。結構的“值”是由其所有成員的值組成的聚合值。在這種情況下,只有一個成員。而且,由于您沒有為成員分配任何值,因此它的值是indeterminate。
但是,對于%p,您打算將指標傳遞給printf(特別是型別的指標void *)。如果您不這樣做,則 C 標準不會定義該行為。引數傳遞機制可能會以各種方式出錯。它可能會格式化成員中的值,val就好像它是一個指標并列印它。或者它可能會列印一些不相關的資料,這些資料恰好是一個暫存器,printf期望找到它應該傳遞的指標。否則您的程式可能會崩潰。
uj5u.com熱心網友回復:
當您取消參考指向 struct Node (*a) 的指標時,您將獲得 struct Node 變數本身。如果你沒有初始化它,你可以得到任何東西(垃圾)。因此,在您的情況下, (00000000001C0150) 是目前在變數結構節點中的一些垃圾。因此,為了清楚起見,我在您的代碼中添加了一行:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int val;
};
int main() {
struct Node* a = (struct Node*) malloc (sizeof(struct Node));
a->val = 1;
printf("%p\n", a);
printf("%p\n", &(a->val));
printf("%p\n", *a);
}
我得到了以下結果:
0xaaab04e522a0
0xaaab04e522a0
0x1
希望對你有所幫助)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490436.html
