c語言野指標與結構體指標動態記憶體分配小解

四夕興言發表於2020-12-11

首先我們來看一道題:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct student
{
char *name; //改 char name [ ];
int score;
}*pstu;
int main()

{
pstu=(struct student*)malloc(sizeof(struct student)); ///將地址轉成struct student* 型
改:char *p=NULL;
strcpy(pstu->name,“tom”);
pstu->score=99;
改:char *p=NULL;
printf(“name =%s,score =%d\n”,pstu->name,pstu->score);
free§;
return 0;
}

原式是一個野指標問題,為了避免出現野指標,通常我們需要將指標初始化為NULL,用完後也為其賦值為NULL。
結構體成員指標往往會被我們忽視,所以說注意它也需要初始化,且需要為結構體指標分配足夠的記憶體!那麼就用到了malloc這個巨集,使用方法如下:

給指標變數賦初值:

方法一:char * p = (char * )malloc(sizeof(char));

方法二:char * p = NULL;

給陣列賦初值:

方法一: int a[10] = {0};

方法二: memset(a, 0, sizeof(a));

memset函式有3個引數:第一個是要被設定的記憶體起始地址;第二個是要被設定的值;第三個是要被設定的記憶體大小,單位為位元組;注意不要混淆:

給結構體指標賦初值:

方法一: pstu = (struct student *)malloc(sizeof(struct student));

常見錯誤: pstu = (struct student *)malloc(sizeof(struct student *));

使用完指標後務必記得釋放指標所指向的記憶體,否則不知道什麼時候我們又改變了指標的值,使其變成了野指標!

這裡就需要free§這個函式的幫忙了,它可以切斷指標與指向記憶體的聯絡。但是需要注意的是free對於同一指標變數只能使用一次。不然會導致出錯或者記憶體洩漏。

釋放完記憶體後另指標的值變為NULL!

如下:

free§;
p = NULL;

另外補充一下動態記憶體分配的有關函式
開闢動態儲存區 #include<stdlib.h>

malloc voidmalloc(unsigned int size); 在記憶體的動態儲存區分配一個長度為size的連續空間 malloc(100) a=(int )malloc(nsizeof(int)) 將nsizeof(int)個記憶體給a

calloc void*calloc(unsigned n,unsigned size); 在記憶體的動態儲存區分配n個長度為size的連續空間 p=calloc(50,4) 50x4個位元組的臨時分配域;

relloc voidrelloc(voidp,unsigned int size); 重新分配動態儲存區; relloc(p,50) 將p所指向的已分配的動態空間改為50位元組;

free void free(void*p); 釋放動態儲存區 free(p)釋放指標p所指向的已分配的動態空間;

相關文章