Moät soá kieán thöùc cô sôû veà laäp trình baèng ngoân ngöõ C

Phaâàn tröôùc | Muïc luïc | Phaâàn sau

XVII. Ñònh vò boä nhôù ñoäng

Noäi dung:

Trong phaàn naøy ta hoïc caùch khai baùo vaø ñònh vò boä nhôù ñoäng - moät phaàn boä nhôù ñeå söû duïng trong chöông trình trong quaù trình chaïy chöông trình ñoù (runtime). Trong C coù 4 haøm chính sau:

 

Haøm malloc()

Duøng ñeå ñònh vò moät khoaûng boä nhôù ñaëc tröng.

#include <stdlib.h>
void *malloc(size_t size);

size chæ soá byte seõ ñònh vò. Haøm seõ traû laïi moät con troû void. Neáu khoâng ñuû boä nhôù, haøm seõ traû laïi con troû NULL.

Ví duï:

1:  /* Using the malloc function */
2:  #include <stdio.h>
3:  #include <stdlib.h>
4:  #include <string.h>
5:  /* function declaration */
6:  void StrCopy(char *str1, char *str2);
7:  /* main() function */
8:  main()
9:  {
10:    char str[] = "Use malloc() to allocate memory.";
11:    char *ptr_str;
12:    int result;
13:    /* call malloc() */
14:    ptr_str = malloc( strlen(str) + 1);
15:    if (ptr_str != NULL){
16:       StrCopy(str, ptr_str);
17:       printf("The string pointed to by ptr_str is:\n%s\n",
18:              ptr_str);
19:       result = 0;
20:    }
21:    else{
22:       printf("malloc() function failed.\n");
23:       result = 1;
24:    }
25:    return result;
26: }
27: /* function definition */
28: void StrCopy(char *str1, char *str2)
29: {
30:    int i;
31:
32:    for (i=0; str1[i]; i++)
33:       str2[i] = str1[i];
34:    str2[i] = `\0';
35: }

Keát quaû:

The string pointed to by ptr_str is:
Use malloc() to allocate memory.

Haøm free()

Haøm duøng ñeå giaûi phoùng phaàn boä nhôù ñaõ ñònh vò tröôùc ñaây baèng leänh malloc() ñeå duøng vaøo vieäc khaùc neáu khoâng söû duïng nöõa.

Ví duï:

1:  /* Using the free() function */
2:  #include <stdio.h>
3:  #include <stdlib.h>
4:  /* function declarations */
5:  void DataMultiply(int max, int *ptr);
6:  void TablePrint(int max, int *ptr);
7:  /* main() function */
8:  main()
9:  {
10:    int *ptr_int, max;
11:    int termination;
12:    char key = `c';
13:
14:    max = 0;
15:    termination = 0;
16:    while (key != `x'){
17:       printf("Enter a single digit number:\n");
18:       scanf("%d", &max);
19:
20:       ptr_int = malloc(max * max * sizeof(int));  /* call malloc() */
21:       if (ptr_int != NULL){
22:          DataMultiply(max, ptr_int);
23:          TablePrint(max, ptr_int);
24:          free(ptr_int);
25:       }
26:       else{
27:          printf("malloc() function failed.\n");
28:          termination = 1;
29:          key = `x';  /* stop while loop */
30:       }
31:       printf("\n\nPress x key to quit; other key to continue.\n");
32:       scanf("%s", &key);
33:    }
34:    printf("\nBye!\n");
35:    return termination;
36: }
37: /* function definition */
38: void DataMultiply(int max, int *ptr)
39: {
40:    int i, j;
41:
42:    for (i=0; i<max; i++)
43:       for (j=0; j<max; j++)
44:          *(ptr + i * max + j) = (i+1) * (j+1);
45: }
46: /* function definition */
47: void TablePrint(int max, int *ptr)
48: {
49:    int i, j;
50:
51:    printf("The multiplication table of %d is:\n",
52:            max);
53:    printf(" ");
54:    for (i=0; i<max; i++)
55:       printf("%4d", i+1);
56:    printf("\n ");
57:    for (i=0; i<max; i++)
58:       printf("----", i+1);
59:    for (i=0; i<max; i++){
60:       printf("\n%d|", i+1);
61:       for (j=0; j<max; j++)
62:         printf("%3d ", *(ptr + i * max + j));
63:    }
64: }

Keát quaû:

Enter a single digit number:
4
The multiplication table of 4 is:
   1   2   3   4
 --------------
1| 1   2   3   4
2| 2   4   6   8
3| 3   6   9  12
4| 4   8  12  16
Press x-key to quit; other key to continue.
C
Enter a single digit number:
2
The multiplication table of 2 is:
   1   2
 ------
1| 1   2
2| 2   4
Press x-key to quit; other key to continue.
x
Bye!

Haøm calloc()

Haøm calloc() duøng ñeå ñònh vò boä nhôù cho moät bieán cuï theå naøo ñoù, vaø khi ñaõ ñònh vò noù seõ gaùn giaù trò ban ñaàu cho bieán laø 0.

#include <stdlib.h>
void *calloc(size_t nitem, size_t size);

nitem laø soá phaàn töû seõ coù trong boä nhôù ñònh vò, size laø kích thöôùc moãi phaàn töû. calloc() cuõng traû laïi con troû void. Neáu khoâng ñuû boä nhôù, noù seõ traû laïi con troû null.

Ví duï:

1:  /* Using the calloc() function */
2:  #include <stdio.h>
3:  #include <stdlib.h>
4:  /* main() function */
5:  main()
6:  {
7:     float *ptr1, *ptr2;
8:     int i, n;
9:     int termination = 1;
10:
11:    n = 5;
12:    ptr1 = calloc(n, sizeof(float));
13:    ptr2 = malloc(n * sizeof(float));
14:    if (ptr1 == NULL)
15:       printf("malloc() failed.\n");
16:    else if (ptr2 == NULL)
17:       printf("calloc() failed.\n");
18:    else {
19:       for (i=0; i<n; i++)
20:          printf("ptr1[%d]=%5.2f,  ptr2[%d]=%5.2f\n",
21:           i, *(ptr1 + i), i, *(ptr2 + i));
22:       free(ptr1);
23:       free(ptr2);
24:       termination = 0;
25:    }
26:    return termination;
27: }

Keát quaû:

ptr1[0] = 0.00,  ptr2[0] = 7042.23
ptr1[1] = 0.00,  ptr2[1] = 1427.00
ptr1[2] = 0.00,  ptr2[2] = 2787.14
ptr1[3] = 0.00,  ptr2[3] =    0.00
ptr1[4] = 0.00,  ptr2[4] = 5834.73

Haøm realloc()

realloc() cho pheùp ta thay ñoåi kích thöôùc phaàn boä nhôù ñaõ ñònh vò bôûi malloc() hoaëc calloc().

#include <stdlib.h>
void *realloc(void *block, size_t size);

block laø con troû chæ ñeán phaàn boä nhôù ñònh vò, size laø kích thöôùc seõ thay ñoåi. realloc() cuõng traû laïi con troû void. Neáu khoâng thöïc hieän ñöôïc, noù seõ traû laïi con troû null.

Chuù yù, hai caâu leânh sau ñaây laø töông ñöông:
 
ptr_flt = realloc(NULL, 10 * sizeof(float));
ptr_flt = malloc(10 * sizeof(float));

hoaëc

free(ptr);
realloc(ptr, 0);

Ví duï:

1:  /* Using the realloc() function */
2:  #include <stdio.h>
3:  #include <stdlib.h>
4:  #include <string.h>
5:  /* function declaration */
6:  void StrCopy(char *str1, char *str2);
7:  /* main() function */
8:  main()
9:  {
10:    char *str[4] = {"There's music in the sighing of a reed;",
11:                    "There's music in the gushing of a rill;",
12:                    "There's music in all things if men had ears;",
13:                    "There earth is but an echo of the spheres.\n"
14:                   };
15:    char *ptr;
16:    int i;
17:
18:    int termination = 0;
19:
20:    ptr = malloc((strlen(str[0]) + 1) * sizeof(char));
21:    if (ptr == NULL){
22:      printf("malloc() failed.\n");
23:      termination = 1;
24:    }
25:    else{
26:      StrCopy(str[0], ptr);
27:      printf("%s\n", ptr);
28:      for (i=1; i<4; i++){
29:        ptr = realloc(ptr, (strlen(str[i]) + 1) * sizeof(char));
30:        if (ptr == NULL){
31:          printf("realloc() failed.\n");
32:          termination = 1;
33:          i = 4;    /* break the fro loop */
34:        }
35:        else{
36:          StrCopy(str[i], ptr);
37:          printf("%s\n", ptr);
38:        }
39:      }
40:    }
41:    free(ptr);
42:    return termination;
43: }
44: /* function definition */
45: void StrCopy(char *str1, char *str2)
46: {
47:    int i;
48:
49:    for (i=0; str1[i]; i++)
50:       str2[i] = str1[i];
51:    str2[i] = `\0';
52: }

Keát quaû:

There's music in the sighing of a reed;
There's music in the gushing of a rill;
There's music in all things if men had ears;
There earth is but an echo of the spheres.

Baøi taäp

  1. Caàn bao nhieâu boä nhôù ñeå thöïc hieän caùc leänh sau:
  2. Cho moät con troû nguyeân ptr, chæ ñeán phaàn boä nhôù chöùa 100 integers, neáu muoán thay ñoåi thaønh 150 integers, ta duøng leänh naøo?
  3. Kích thöôùc phaàn boä nhôù ñònh vò laø bao nhieâu sau moãi caâu leänh sau:
. . .
ptr = malloc(300 * sizeof(int));
. . .
ptr = realloc(ptr, 500 * sizeof(int));
. . .
ptr = realloc(ptr, 60 * sizeof(int));
. . .
ptr = calloc(100 * sizeof(char));
. . .
free(ptr);
ptr = realloc(NULL, 200 * sizeof(char));
. . .
ptr = realloc(ptr, 0);
  1. Vieát chöông trình hoûi ngöôøi söû duïng cho vaøo bao nhieâu soá float. Sau ñoù duøng malloc() vaø alloc() ñeå ñònh vò 2 boä nhôù coù cuøng kích thöôùc öùng vôùi baáy nhieâu soá float, vaø in ra maøn aûnh caùc giaù trò ban ñaàu cuûa chuùng ñöôïc löu trong caùc boä nhôù ñònh vò ñoù.

Phaâàn tröôùc | Muïc luïc | Phaâàn sau