1. 程式人生 > 程式設計 >c語言動態記憶體分配知識點及例項

c語言動態記憶體分配知識點及例項

c語言怎麼實現動態記憶體分配

我們經常會預先給程式開闢好記憶體空間,然後進行操作。

int arr[5] ;

對這個陣列我們在定義的時候必須給提前開闢好空間,並且在程式執行的過程中,這個開闢的記憶體空間是一直存在的,除非等到這個函式執行完畢,才會將空間釋放。有個問題就是這個陣列在程式中無法被修改。

這些問題給我們造成了一些使用上的不方便,所以,C中提供了malloc()函式。

關於malloc()函式,這個函式它接受一個引數:就是所需的記憶體的位元組數。然後malloc()找到可用記憶體中那一個大小適合的塊。在這個過程中,malloc()可以來返回那塊記憶體第一個位元組的地址。所以,也就意味了我們可以使用指標來操作。malloc()可以用來返回陣列指標、結構指標等等,所以我們需要把返回值的型別指派為適當的型別。當malloc()找不到所需的空間時,它將返回空指標。

例:

double *p;

p=(double*)malloc(30*sizeof(double));

在這個程式中,首先開闢了30個double型別的空間,然後把p指向這個空間的位置。在這裡的指標是指向第一個double值。並不是我們全部開闢的30個double的空間。這就和陣列一樣,指向陣列的指標式指向陣列首元素的地址,並不是整個陣列的元素。所以,在這裡我們的操作也和陣列是一樣的,

p[0]就是第一個元素,p[1]就是第二個元素。

至此,我們就可以掌握到一種宣告動態陣列的方法。

int arr[n];

p=(int *)malloc(n*sizeof(int));

//我們在這裡使用的時候要元素個數乘型別位元組長度,這樣就達到了動態開闢記憶體空間。

當我們使用malloc()開闢完記憶體空間以後,我們所要考慮的就是釋放記憶體空間,在這裡,C給我們提供了free()函式。free()的引數就是malloc()函式所返回的地址,釋放先前malloc()函式所開闢的空間。

例:

對於上面我們所開闢的空間進行釋放,那麼我們就可以這樣

free(p);

程式還呼叫了exit()函式,這個函式是在記憶體分配失敗時結束程式。

程式例子:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<malloc.h>//malloc()函式被包含在malloc.h裡面
#include<stdlib.h>
int main(void)
{
  char*a = NULL;//宣告一個指向a的char*型別的指標
  a = (char*)malloc(100 * sizeof(char));//使用malloc分配記憶體的首地址,然後賦值給a
  if (!a)//如果malloc失敗,可以得到一些log
  {
    perror("malloc");
    return-1;
  }
  sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"寫入a指向的地址
  printf("%s\n",a);//輸出使用者輸入的資料
  free(a);//釋放掉使用的記憶體地址
  system("pause");
  return 0;//例2有無記憶體洩露?
}

這個程式主要用來檢測malloc返回值條件有誤。

在這裡我們需要注意,在C中,型別指派(char *)是可選的,但是在C++中這個是必須有的,所以使用型別指派將使把C程式移植到C++更容易。

使用動態陣列,主要是為了獲得程式的靈活性。我們可以需要多少個元素就讓陣列開闢多少個。不需要浪費空間。

知識點補充:

常見的動態記憶體錯誤

常見的錯誤有:對NULL指標進行解引用操作、對分配的記憶體進行操作時越過邊界、釋放並非記憶體分配的記憶體、試圖釋放一塊動態分配的記憶體的一部分以及一塊動態記憶體釋放之後被繼續使用。

到此這篇關於c語言動態記憶體分配知識點及例項的文章就介紹到這了,更多相關c語言怎麼實現動態記憶體分配內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!