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 }
我們發現打印的數據459521,轉換成二進制,按每個字節來看,依次是7,3,1 這個和我們初始化結構體。
也就是說,結構體變量a就對應,整個結構體的變量內存空間。對結構體指針解引用,同樣表示整個結構體的變量內存空間。
如果沒有 memset(p, 0, sizeof(*p));這句打印出來的值是:
可以看到,后面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))也能得到我們想看到的結果。