在stdlib.h 中的几个重要内存管理函数为 calloc(), malloc(), free(), realloc();当然还有其他的函数,
这里不打算全部都列出来了。详细加深理解的话,还是要看手册和代码实现源文件。
一、内存分配和释放函数:
二、函数基本应用:
1.二维动态数组分配练习:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main(int argc, char *argv[])
5 {
6 int i, j, n, m;
7 scanf("%d%d", &n, &m);
8 int *array;
9 printf("row: %d, col: %d\n", n, m);
10
11 /* malloc 分配一维数组当二维数组使用
12 * ,引用方式:如下(1)(2)
13 */
14 array = (int *)malloc(n * m * sizeof(int));
15 for (i = 0; i< n; i++)
16 for(j = 0; j< m; j++)
17 scanf("%d", array +m *i +j); /*(1)*/
18
19
20 for (i = 0; i< n; i++) {
21 for(j = 0; j< m; j++)
22 printf("%d\t", array[m *i +j]); /*(2)*/
23 printf("\n");
24 }
25
26 free(array);
27 return 0;
28 }
29
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main(int argc, char *argv[])
5 {
6 int i, j, n, m;
7 scanf("%d%d", &n, &m);
8 printf("row: %d, col: %d\n", n, m);
9
10 /* 尝试类似一般二维数组引用的分配方法 */
11 int **array;
12 array = (int **)malloc(sizeof(int *) * n);
13 for (i = 0; i < n; i++)
14 array[i] = (int *)malloc(sizeof(int) * m);
15
16 for (i = 0; i< n; i++)
17 for(j = 0; j< m; j++)
18 scanf("%d", &array[i][j]);
19
20 for (i = 0; i< n; i++) {
21 for(j = 0; j< m; j++)
22 printf("%d\t", array[i][j]);
23 printf("\n");
24 }
25
26 /* 释放内存比较麻烦, 注意顺序 */
27 for (i = 0; i < n; i++)
28 free(array[i]);
29 free(array);
30
31 return 0;
32 }
33
和引用和一般二维数组是一样的,只是二维数组在内存上是连续的。
而类似上面动态分配的二维数组,很可能在内存上并不连续,二进制代码中访问数据过程并不一样。
2.一种错误的应用方式:
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main(int argc, char *argv[])
5 {
6 int a =5, b =10; /*测试用*/
7 int i, j, n, m;
8 scanf("%d%d", &n, &m);
9
10 int **array;
11 int *dest;
12 dest = (int *)malloc(sizeof(int *) * n);
13 /* a,b,n,m,dest,array等的值可能已被修改,和变量在栈的分配顺序等有关 */
14 array = &dest; /* array必须是足够大的空间保存int*数组,但不是 */
15 for (i = 0; i < n; i++) {
16 printf("row: %d, col: %d\t", n, m);
17 printf("a: %d, b: %d\n", a, b);
18 printf("dest: 0x%x\t", dest);
19 printf("array: 0x%x\n\n", array);
20
21 array[i] = dest + n * i;
22 }
23
24 for (i = 0; i< n; i++)
25 for(j = 0; j< m; j++)
26 scanf("%d", &array[i][j]);
27
28 for (i = 0; i< n; i++) {
29 for(j = 0; j< m; j++)
30 printf("%d\t", array[i][j]);
31 printf("\n");
32 }
33
34 //free(dest);
35 return 0;
36 }
37