一、概述
C语言是不能直接定义动态数组的,数组必须在初始化时确定长度。
如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组。
二、动态内存分配函数
1、malloc()函数
void *malloc(unsigned int size)
分配size个字节的内存空间,返回地址的指针,如果内存不够分,就返回空指针NULL。 注意:返回的指针是没有类型的,所以要使用得强制类型转换。
2、calloc()函数
void *calloc(unsigned int num, unsigned int size)
这个也是申请动态内存空间,不过就是分开了而已。 一共申请num个长度为size字节的内存空间。
3、free()函数
void free(void *p)
释放指针p内存空间。
这个很重要!!!!很重要!!!重要!!!
4、realloc()函数
void *realloc(void *p, unsigned int size)
给指针p申请的存储空间改为size个字节,返回的是存储空间首地址(指针)
三、动态数组实现
1、一维动动数组实现
dynamicArrayOneDimensional.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include <stdio.h>
#include <stdlib.h>
/**************************************************
dynamicArrayOneDimensional.c
输入N个数,求平均数
**************************************************/
main()
{
int *p = NULL, n, i, sum;
printf("Please enter array size:");
scanf("%d", &n);
/* 申请地址n个长度为sizeof(int)的连续存储空间 */
p = (int *)malloc(n * sizeof(int));
if(p == NULL)
{
printf("No enough memory!\n");
exit(0);
}
printf("Please enter the score:");
for(i = 0; i<n; i++)
{
scanf("%d", p+i);
}
sum = 0;
for(i = 0; i<n; i++)
{
sum = sum + *(p + i);
}
printf("aver = %d\n", sum/n);
free(p);
}
|
2、二维动态数组的实现
dynamicArrayTwoDimensional.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include <stdio.h>
#include <stdlib.h>
int findMax(int *p, int m, int n, int *pRow, int *pCol);
int main()
{
int *pScore = NULL, i, j, m, n, maxSocre, row, col;
printf("Please enter array size m,n:");
scanf("%d, %d", &m, &n);
pScore = (int *) calloc(m*n, sizeof(int));
if(pScore == NULL)
{
printf("No enough memory!\n");
exit(0);
}
printf("Please enter the score:\n");
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &pScore[i*n+j]);
}
}
maxSocre = findMax(pScore, m, n, &row, &col);
printf("maxSocre = %d, class = %d, number = %d\n", maxSocre, row+1, col+1);
free(pScore);
return 0;
}
int findMax(int *p, int m, int n, int *pRow,
|