首页 > 生活常识 >

动态数组函数的使用方法(C语言高级用法 - 动态数组)

100次浏览     发布时间:2024-09-02 10:31:11    


C语言动态数组是指在声明时没有确定数组大小的数组,即忽略方括号中的下标;当要用它时,可随时用内存管理函数重新指定数组的大小。动态数组的内存空间是从堆(heap)上分配的,是在执行代码过程中分配的,当程序执行到这些语句时,才为其分配。注意,程序员自己负责释放内存。

C语言提供了一些内存管理函数来帮助我们来按需要动态地分配和回收内存空间,这些函数包括:

- `malloc(size)`:在堆上分配一块长度为size字节的连续区域,并返回其首地址。

- `calloc(n, size)`:在堆上分配n块长度为size字节的连续区域,并返回其首地址。与malloc不同的是,calloc会将分配的空间初始化为0。

- `realloc(p, size)`:重新分配堆上的指针p所指的空间,使其长度为size个字节,并返回新的首地址。同时会复制原有内容到新分配的空间。注意,size可大可小(如果新的大小大于原内存大小,则新分配部分不会被初始化;如果新的大小小于原内存大小,可能会导致数据丢失)。

- `free(p)`:释放指针p所指的堆上的空间。

这些函数都需要包含`<stdlib.h>`头文件。使用这些函数时,需要注意以下几点:

- 函数的返回值是`void*`类型,表示一个无类型或类型不确定的指针。我们可以用强制类型转换的方法将其转换为所需的类型,例如`int* p = (int*)malloc(sizeof(int) * n);`。

- 函数的返回值可能是NULL,表示内存分配失败。我们需要在使用指针之前检查是否为NULL,并做相应的异常处理。

- 分配的堆空间是没有名字的,只能通过返回的指针找到它。我们不能对非动态分配的存储块使用free,也不能对同一块内存区同时用free释放两次。

- 调用free时, 传入指针指向的内存被释放, 但调用函数的指针值可能保持不变, 因为p是作为形参而传递给了函数。严格地说, 被释放的指针值是无效的, 因为它已不再指向所申请 的内存区。这时对它的任何使用便可能会带来问题。

使用内存管理函数构建动态数组时,需要遵循以下原则:

- 申请空间时,从外层往里层,逐层申请。

- 释放空间时,从里层往外层,逐层释放。

以二维整型数组`int arr[m][n]`为例,我们可以用以下代码来构建和释放动态数组:

// 构建二维动态数组
int m, n; // 数组大小
int** arr; // 二维指针
scanf("%d%d", &m, &n); // 输入数组大小
arr = (int**)malloc(sizeof(int*) * m); // 申请m个一维指针
if (arr == NULL) { // 检查是否申请成功
  printf("内存申请失败!\n");
  exit(1);
}
for (int i = 0; i < m; i++) {
  arr[i] = (int*)malloc(sizeof(int) * n); // 申请n个整型数据
  if (arr[i] == NULL) { // 检查是否申请成功
    printf("内存申请失败!\n");
    exit(1);
  }
}
// 使用动态数组
for (int i = 0; i < m; i++) {
  for (int j = 0; j < n; j++) {
  	scanf("%d", &arr[i][j]); // 输入数组元素
  }
}
for (int i = 0; i < m; i++) {
  for (int j = 0; j < n; j++) {
 	 printf("%d ", arr[i][j]); // 输出数组元素
  }
printf("\n");
}

// 释放动态数组
for (int i = 0; i < m; i++) {
	free(arr[i]); // 释放每一行的空间
}
free(arr); // 释放指针数组的空间
arr = NULL; // 将指针置为NULL,避免野指针
相关文章
股票线的走势代表什么(什么是股票趋势线)
生活常识 2025-06-07
辽宁盘锦稻田蟹养殖(辽宁盘锦稻田养蟹的优点、存在问题及发展建议)
生活常识 2025-06-06
象拔蚌怎样做最好吃 ?学会这一招,你也能在家做出美味的象拔蚌
生活常识 2025-06-06
为什么房贷越短越好(房贷“越短越好”还是“越长越好”?)
生活常识 2025-05-09
厨房总是跳闸是为什么(入住不到2个月,一用厨房插座就跳闸)
生活常识 2025-05-09
属鼠配什么婚姻最好(属鼠人和这3个属相结婚)
生活常识 2025-05-08
什么牌子家具好用(世界知名品牌家具)
生活常识 2025-05-08
什么去甲醛的植物最好(甲醛最怕的6种“吸毒王”!)
生活常识 2025-05-07
葡萄能做什么好吃的(5款用葡萄制作的美食)
生活常识 2025-05-07
为什么结婚当晚要圆房(新婚夫妇的新房为何叫“洞房”及初夜为何叫“圆房”)
生活常识 2025-05-06
地面石材为什么要养护(这些石材养护内容,你需要了解!)
生活常识 2025-05-06
为什么浴室会有凳子(浴室里的“隐形守护者”!)
生活常识 2025-05-05
为什么叫柔性套管(刚性和柔性防水套管区别)
生活常识 2025-05-05
冬季树木为什么要修剪(果树要挂满枝,冬剪是关键)
生活常识 2025-05-04
真石漆为什么色花(真石漆应用的详细介绍)
生活常识 2025-05-04
厕所为什么有味怎么解决(卫生间臭气不散用这5招!)
生活常识 2025-05-03
管理者的基本素质和方法(平易近人,管理者必备的素质要求)

网站内容来自网络,如有侵权请联系我们,立即删除!
Copyright © 内百科 鲁ICP备2023048205号-2