C pengurusan ingatan


Bab ini akan menerangkan pengurusan memori dinamik dalam C. Bahasa C menyediakan beberapa fungsi untuk peruntukan dan pengurusan memori. Fungsi ini boleh didapati dalam fail pengepala <stdlib.h>.

< td >1
Nombor siriFungsi dan perihalan
序号函数和描述
1void *calloc(int num, int size);
该函数分配一个带有 num 个元素的数组,每个元素的大小为 size 字节。
2void free(void *address);
该函数释放 address 所指向的h内存块。
3void *malloc(int num);
该函数分配一个 num 字节的数组,并把它们进行初始化。
4void *realloc(void *address, int newsize);
该函数重新分配内存,把内存扩展到 newsize
void *calloc(int num, int size);
Fungsi ini memperuntukkan tatasusunan dengan

num

elemen, setiap elemen Saiz ialah

saiz

bait.
2

void free(void *address); .

3

void *malloc(int num); Tatasusunan bait dan mulakannya.
4

void *realloc(void *address, int newsize); untuk

memberitakan

.

Peruntukkan memori secara dinamik

Apabila pengaturcaraan, jika anda mengetahui saiz tatasusunan terlebih dahulu, maka apabila mentakrifkan tatasusunan Ia agak mudah. Sebagai contoh, tatasusunan untuk menyimpan nama orang, ia boleh memuatkan sehingga 100 aksara, jadi anda boleh menentukan tatasusunan seperti ini:

char name[100];

Walau bagaimanapun, jika anda tidak mengetahui terlebih dahulu panjang teks yang diperlukan untuk disimpan, contohnya anda ingin menyimpan huraian terperinci topik yang berkaitan. Di sini, kita perlu menentukan penunjuk yang menunjuk kepada aksara dengan saiz memori yang tidak ditentukan, dan kemudian memperuntukkan memori mengikut permintaan, seperti yang ditunjukkan di bawah:

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){   char name[100];   char *description;

   strcpy(name, "Zara Ali");   /* 动态分配内存 */
   description = malloc( 200 * sizeof(char) );   if( description == NULL )   {
      fprintf(stderr, "Error - unable to allocate required memory\n");   }   else   {
      strcpy( description, "Zara ali a DPS student in class 10th");   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );}
Apabila kod di atas disusun dan dilaksanakan, Ia akan menghasilkan keputusan berikut:
Name = Zara AliDescription: Zara ali a DPS student in class 10th

Atur cara di atas juga boleh ditulis menggunakan

calloc(), cuma gantikan malloc dengan calloc, seperti yang ditunjukkan di bawah:

calloc(200, sizeof(char));

Apabila memperuntukkan memori secara dinamik , anda mempunyai kawalan penuh dan boleh melepasi nilai dalam sebarang saiz. Tatasusunan dengan saiz yang telah ditetapkan tidak boleh diubah saiznya setelah ditentukan.

Ubah saiz memori dan lepaskan memori

Apabila atur cara keluar, sistem pengendalian secara automatik akan mengeluarkan semua memori yang diperuntukkan kepada atur cara, bagaimanapun, anda disyorkan untuk memanggilnya apabila anda melakukannya tidak memerlukan memori. Fungsi
free()<🎜> untuk melepaskan memori. <🎜><🎜>Sebagai alternatif, anda boleh menambah atau mengurangkan saiz blok memori yang diperuntukkan dengan memanggil fungsi <🎜>realloc()<🎜>. Mari lihat contoh di atas sekali lagi menggunakan fungsi realloc() dan free(): <🎜>
#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){   char name[100];   char *description;

   strcpy(name, "Zara Ali");   /* 动态分配内存 */
   description = malloc( 30 * sizeof(char) );   if( description == NULL )   {
      fprintf(stderr, "Error - unable to allocate required memory\n");   }   else   {
      strcpy( description, "Zara ali a DPS student.");   }   /* 假设您想要存储更大的描述信息 */
   description = realloc( description, 100 * sizeof(char) );   if( description == NULL )   {
      fprintf(stderr, "Error - unable to allocate required memory\n");   }   else   {
      strcat( description, "She is in class 10th");   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );   /* 使用 free() 函数释放内存 */
   free(description);}
<🎜>Apabila kod di atas disusun dan dilaksanakan, ia menghasilkan keputusan berikut: <🎜>
Name = Zara AliDescription: Zara ali a DPS student.She is in class 10th
<🎜>Anda boleh Jika anda cuba tanpa memperuntukkan semula memori tambahan, fungsi strcat() akan menjana ralat kerana memori tidak mencukupi untuk menyimpan penerangan. <🎜><🎜>