动态数组初始化
C语言中可以通过在堆上动态分配内存空间的方式来声明一个元素个数可变的动态数组,比如通过stdlib.h标准库中的malloc()函数或calloc()函数,其中后者可以将数组的每一个元素都初始化为0,而前者则不会进行该项的操作。
通常情况下,动态的数组在被使用之前应该被初始化。
初始化的三要素
C语言动态数组的初始化方法不止一种,这一章节将介绍的是其中的一种,使用循环来初始化?为什么要先介绍这种方法呢?原因如下:
动态数组的元素容量是可变的,使用循环来初始化,可以更好地操作数组的现有已经赋值的元素个数current_size和容量size这两个数据;
通过现有已赋值的元素个数current_size或实际的元素个数和容量size,可以更好地操作动态数组的内存空间,比如当实际元素个数比当前的容量小,则可以对其进行缩小,相反,则可以进行扩大,使内存空间的利用更加高效;
当current_size等于容量size的时候,就应当停止初始化,避免访问越界,要不然就动态地为数组扩容;
因此,动态数组的初始化的三要素可总结如下(个人理解,仅供参考):
循环、实时统计现有元素个数,以及数组的容量(个数,不是字节大小)。
动态数组初始化实例代码
#include "stdio.h"
#include "stdlib.h"
int main() {
int current_size = 0;
int size = 10;
int *ptr = (int*)calloc(size, sizeof(int));
// for循环初始化,特意设置为i<9,使数组保留一个元素未显式初始化
if(ptr == NULL){
printf("内存分配未成功!\n");
}else{
for(int i=0; i<9; i++){
ptr[i] = i;
current_size++;
if(current_size == size){
// 当实际元素个数等于容量size时,停止循环,避免访问越界
printf("动态数组全部初始化完成!\n");
break;
}
}
if(current_size < size){
printf("动态数组未全部初始化!\n");
// 如果需要将动态数组的容量缩小,可以在这里设置
// 本章暂且不介绍动态数组的容量修改的方法
// 除此之外,还可以将size的大小设置为current_size
// 留待后期使用
// size = current_size;
}
// 访问最后一个元素,值为0,
// 因为calloc()动态分配内存时会自动将每个元素初始化为0
printf("%d\n",ptr[9]);
printf("%d\n",ptr[5]); //访问其它位置的元素,查看赋值情况
free(ptr);
ptr = NULL;
}
return 0;
}
代码编译后,得到输出:
动态数组未全部初始化!
0
5
实例代码提示
current_size和size的作用域应该是较广的,虽然不一定是全局的,其值应该也是动态可变的,因此,其标识符应该是比较有特点的,不应该像实例中的那样,看上去十分普遍,避免被随意使用、更改。
免责声明:内容仅供参考,不保证正确性。 |