解引用結構體指針的值是什么


 1 #include <stdio.h>   
 2 #include <string.h>
 3 
 4 typedef    struct abc
 5 {
 6     char a;
 7     char b;
 8     char c;
 9 }Abc; 
10 
11 
12 int main(int argc, char *argv[])
13 {    
14     Abc  a;
15     Abc* p = &a;
16 
17     memset(p, 0, sizeof(*p)); //保證內存一開始就是干凈的 
18     a.a = 1;
19     a.b = 3;
20     a.c = 7;
21 
22    printf("%d\n",a);
23    printf("%d\n",*p);     
24 }

 

wps21E4.tmp

我們發現打印的數據459521,轉換成二進制,按每個字節來看,依次是7,3,1 這個和我們初始化結構體。

也就是說,結構體變量a就對應,整個結構體的變量內存空間。對結構體指針解引用,同樣表示整個結構體的變量內存空間。

如果沒有 memset(p, 0, sizeof(*p));這句打印出來的值是:

wps2204.tmp

可以看到,后面3個字節的值和之前是一致的,最高字節不是0。這就和struct的對齊方式有關了。我們定義的struct變量擁有3個char變量。所以char

變量依次按着排列,占據3個字節,而根據對齊原理,第四個字節依然屬於這個結構體,但是我們並沒有初始化這個字節。所以第四個字節是亂碼。

我們通過指針p,p正好指向結構體變量a,通過memset(p, 0, sizeof(*p))之后,就把4個字節的空間全部初始化為0。所以就能得到想要的結果。

當然如果該結構體直接是擁有4個char變量,然后我們將結構體內部每個變量都初始化,那么就不需要memset(p, 0, sizeof(*p))也能得到我們想看到的結果。      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM