以前總有一種疑惑。為什麼結構體的指針有的需要用分配空間?有的不需要分配空間呢?現在總結一下思路:
一:關於結構體的定義問題:使用結構體一般會使用變數或者定義指針
typedef struct{
int a;
int b;
}data;
使用這個結構體的兩種方式:
- data datas 直接引用。這樣使用類似於int a 這種模式。data類似於一個類型(如:int)這樣的話,在使用的時候,系統自動會為這個類型分配空間。在棧上進行分配,在使用完成後會自動釋放。
- data *dates 指針調用。定義一個data類型的指針。使用這種指針需要做的是分配空間和釋放空間以及初始化。人為的進行分配和釋放,這部分空間一般會位於堆的位置。你也可以讓指針直接指向已經存在的空間。
二:關於結構體指針的傳遞和調用的用法:
typedef struct{
int a;
int b;
}date;
static int intcms(void *para){
int c = ((date *)para)->a;
printf("c is %d\n",c);
}
int main(int argc, char **argv)
{
date dates;
dates.a = 9;
dates.b = 2;
intcms(&dates);
}
上述調用中採用的結構體變數。在傳入函數時通過指針void *para指針傳遞過去。需要注意的是不能直接使用para->a來訪問結構體的成員。為什麼呢。這是因為para只是接收過來的地址。para雖然指向的結構體的首地址。但是這個指針並不知道自己指向的是什麼內容和有多少成員。需要(date *)para強制轉化一下。這樣para就可以知道自己是什麼類型的指針。有多少成員。
typedef struct{
int a;
int b;
}date;
static int intcms(void *para){
int c = ((date *)para)->a;
printf("c is %d\n",c);
}
int main(int argc, char **argv)
{
date *dates = (date *)malloc(sizeof(date));
dates->a = 9;
dates-> = 2;
intcms(dates);
free(dates);
}
上述代碼使用結構體指針需要分配空間和釋放空間。這是堆的使用。如果你不釋放。在整個進程結束的時候。系統有會自動回收。簡單的程序沒什麼問題。但是在需要分配大量的空間就可能導致出資源浪費或者內存耗盡的情況
三:結構體定義的幾種方法
#include <stdio.h>
#include <string.h>
#include <malloc.h>
/*先定義幾類結構體*/
struct str{
int a;
int b;
}str1;
/*這是第一類結構體的形式,有結構體名,有結構體變數*/
struct str2{
int a;
int b;
};
/* 這是第二類結構體的形式,有結構體名,無結構體變數 */
typedef struct {
int a;
int b;
}STR3;
/* 這是第三類結構體的形式,把結構體重定義為STR3 */
typedef struct str4{
int a;
int b;
}STR4;
/*這是第四類結構體的形式,把結構體重定義為STR4,還有結構體名稱*/
void main()
{
/*定義各類的指針*/
struct str *p;
struct str2 *p2;
STR3 *p3;
struct str4 *p4;
STR4 *p5;
/*-----------------------------------------------*/
p = &str1; /*結構體指針指向結構體變數的地址首地址*/
p->a=1;
p->b=2;
printf("p->a=%d,p->b=%d\n",p->a,p->b);
/*-----------------------------------------------*/
p2 = (struct str2 *)malloc(sizeof(struct str2)); /*為結構體指針分配對應結構體類型的大小的首地址*/
p2->a=1;
p2->b=2;
printf("p2->a=%d,p2->b=%d\n",p2->a,p2->b);
/*-----------------------------------------------*/
p3 = (STR3 *)malloc(sizeof(STR3)); /*為結構體指針分配對應結構體類型的大小的首地址*/
p3->a=1;
p3->b=2;
printf("p3->a=%d,p3->b=%d\n",p3->a,p3->b);
/*-----------------------------------------------*/
p4 = (struct str4 *)malloc(sizeof(struct str4));/*為結構體指針分配對應結構體類型的大小的首地址*/
p4->a=1;
p4->b=2;
printf("p4->a=%d,p4->b=%d\n",p4->a,p4->b);
struct str4 str4a;
p4 = &str4a;/*結構體指針指向結構體變數的地址的首地址*/
p4->a=1;
p4->b=2;
printf("p4->a=%d,p4->b=%d\n",p4->a,p4->b);
/*--------------------------------------------------*/
/*-----------------------------------------------*/
p5 = (STR4 *)malloc(sizeof(STR4));/*為結構體指針分配對應結構體類型的大小的首地址*/
p5->a=1;
p5->b=2;
printf("p5->a=%d,p5->b=%d\n",p5->a,p5->b);
p5 = &str4a;/*結構體指針指向結構體變數的地址的首地址*/
p5->a=1;
p5->b=2;
printf("p5->a=%d,p5->b=%d\n",p5->a,p5->b);
/*--------------------------------------------------*/
}
運行結果如下:
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/274326.html
微信掃一掃
支付寶掃一掃