一、动态创建二维数组
我们知道二位数组名是一个二级指针常量,即行指针,二维数组在内存中是开辟了一块连续空间。int a[m][n];定义一个二维数组,a是数组名,a[i]是一个列指针,可以引用a[i][0]到a[i][n-1]的元素。根据上述描述特性,我们可以动态创建二维数组:
代码:
#include<stdio.h>
#include<stdlib.h>
void destroy(int** p, int m, int n);//销毁动态申请的内存空间
int** assign(int size, int m, int n);//动态创建二维数组
int main()
{
int** test=NULL;//定义一个行指针
int n, m, i, j;
printf("请输入行数(m):,列数(n):");
scanf("%d %d", &m, &n);
test = assign(sizeof(int), m, n);
if (test == NULL)
{
return 0;
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
test[i][j] = i + j + 1;
printf("%d ", test[i][j]);
}
printf("\n");
}
destroy(test, m, n);
return 0;
}
int** assign(int size, int m, int n)
{
int i, j;
int** q = (int**)malloc(sizeof(int*) * m);
//上面语句开辟了一块连续空间,并把首地址强制类型转换为(int**),空间里的每个元素都是一级指针
//就相当于二维数组的列指针
if (q == NULL)//先判断申请内存是否成功
{
return 0;
}
for (i = 0; i < m; i++)
{
*(q + i) = (int*)malloc(size * n);//给每个一级指针申请n*size字节的内存空间
if (*(q + i) == NULL) //每次申请的n*int字节的空间地址并不不连续
{ //这也是与二维数组本质上的不同
for (j = 0; j < i; j++)
{
free(*(q + j));
}
free(q);
return 0;
}
}
return q;
}
void destroy(int** p, int m, int n)
{
int i;
for (i = 0; i < m; i++)
{
free(*(p + i));
}
free(p);
}
二、一维数组的动态创建
一维数组就简单多了,下面给出代码:
//动态创建一维数组
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int* fun_creat_random(int n);//动态创建一维数组
int main()
{
int* arr = NULL;
int n;
printf("请输入产生的随机数个数(10<=n<=50):");
scanf("%d", &n);
if (n < 10 || n>50)
{
return 1;
}
arr = fun_creat_random(n);
if (arr == NULL)
{
printf("分配内存失败。\n");
return 0;
}
else
{
int i;
for (i = 0; i < n; i++)
{
printf("arr[%d]=%d\n", i, arr[i]);
}
}
printf("\n");
return 0;
}
int* fun_creat_random(int n)
{
srand((unsigned)time(NULL));//生成随机种子
int* arr = (int*)malloc(sizeof(int) * n);
if (arr != NULL)
{
int i;
for (i = 0; i < n; i++)
{
*(arr + i) = rand();//产生随机数
}
return arr;
}
else
return arr;
}
希望对你们有帮助!