C\C++中結構體變量與結構體指針內存分配問題

聲明一個結構體變量,不管是否初始化,都開闢內存,聲明一個結構體指針變量,對其初始化的時候纔會開闢內存。數組

A a[3];  a是A型的,有3個,固然分配A乘3大小的空間ide

A* a;    a是A*型的,固然只分配A*大小的空間,而不會分配A大小的空間

好像跟你說的不太同樣,結構體數組的話,我在課本里看到的確不用再次申請空間了啊[/quote]

結構體變量分配結構體自己大小的空間,結構體指針分配4個字節,其實任何類型的指針都是分配四個字節的指針空間。
因此:
A a[3]; //a裏面是三個A變量,因此分配三個結構體大小
A *a;  //a是一個指針,分配4個字節,就算A再大,a也只是4個字節,由於任何類型的指針都是4個字節。要使用a,必須先要對指針初始化,也即分配空間了。
如:
A *a;
a = (A*)malloc(sizeof(A));

咱們徹底能夠撇開結構體,把問題簡單化成int類型來講明這個指針問題:
int a1[10];
int *a2;

很容易知道,a1是包含10個int的數組,大小也就是10*sizeof(int)。咱們能夠直接使用a1不要在進行什麼初始化或者分配空間的遊戲,由於數組a1裏面自己存放的就是int變量自己了。

而後a2,是一個int*的東西,也就是整型指針,a2不能存放int變量,它只能存放地址,一個int變量的地址。若是要使用a2,必須首先對a2初始化,即將它指向一個int變量的地址,如:
a2 = (int*)malloc(sizeof(int));
或者
int i = 10;
a2 = &i;
因此,malloc函數的做用是首先聲明一個變量,而後返回該變量的地址。
因此:a2 = (int*)malloc(sizeof(int)) 的含義就是把該變量的地址賦值給a2,和a = &i 本質上並無什麼不一樣,只是一個變量是棧上,一個是堆上,都是一個地址賦值。

因此,所謂的分配空間,就是對指針賦值,把一個變量的地址賦值給一個指針。
相關文章
相關標籤/搜索