Bootstrap

动态数组与静态数组的区别(附动态二维数组的实现)

目录

动态数组与静态数组的详细区别

1、内存分配

2、复杂性分析

3、sizeof使用

4、生存期

5、动态二维数组实现


动态数组与静态数组的详细区别

1、内存分配

动态数组通常在内存的堆区分配内存,需要程序员自己运用代码来申请空间,申请的大小可以由程序员来调整,通常在程序运行时通过重新分配内存来改变。(一般用malloc,new来申请空间)

静态数组通常在内存的栈区分配内存,并且分配的空间大小是在编译期间就已经确定,在程序运行期间无法改变。

2、复杂性分析

动态数组需要在程序运行时动态分配和释放,程序员要确保申请的空间被正确释放,否则会导致内存泄漏,使用较复杂。(一般用delete,free释放空间)

只有静态存储的数组才能初始化,静态数组在定义时,若未初始化,则系统自动将所有数组元素赋值为0,使用较为简单。

3、sizeof使用

对于动态数组,sizeof仅返回指向数组的指针大小。

对于静态数组,sizeof返回整个数组的大小,即数组元素个数。

4、生存期

动态数组的生存期由申请空间开始,直至释放空间。

静态数组的生存期和其作用域有关。

例如:在函数内部定义的,生存期为函数执行期间。

           在函数外部定义的全局变量,生存期为整个程序运行期间。

5、动态二维数组实现

结构体及函数部分:

typedef struct
{
	int rowsize;
	int colsize;
	int** data;
}Array2D;

extern void InitArray2D(Array2D* pa, int r, int c)
{
	assert(pa != NULL);
	pa->colsize = c;
	pa->rowsize = r;
	pa->data = (int**)malloc(sizeof(int*) * r);
	for (int i = 0; i < c; i++)
	{
		pa->data[i] = (int*)malloc(sizeof(int) * c);
	}
}

extern void InitFileArray2D(Array2D* pa)
{
	assert(pa != NULL);
	FILE* fp = fopen("maze.txt", "r");
	if (NULL == fp)
	{
		printf("file open error \n");
		exit(1);
	}
	for (int i = 0; i < pa->rowsize; ++i)
	{
		for (int j = 0; j < pa->rowsize; ++j)
		{
			fscanf(fp, "%d", (*(pa->data+i)+j));
		}
	}
	fclose(fp);
	fp = NULL;
}

extern void DestroyArray2D(Array2D* pa)
{
	assert(pa != NULL);
	for (int i = 0; i < pa->rowsize; i++)
	{
		free(pa->data[i]);
	}
}

extern void SetValue(Array2D* pa, int r, int c, int val)
{
	assert(pa != NULL);
	*(*(pa->data + r) + c) = val;
}

extern int GetValue(Array2D* pa, int r,int c)
{
	assert(pa != NULL);
	return *(*(pa->data + r) + c);
}

extern void PrintArray2D(Array2D* pa)
{
	assert(pa != NULL);
	for (int i = 0; i < pa->colsize; ++i)
	{
		for (int j = 0; j < pa->rowsize; ++j)
		{
			printf("%2d", *(*(pa->data + i) + j));
		}
		printf("\n");
	}
	printf("\n --------------------------------\n");
}

主函数部分:

int main()
{
	Array2D arr;
	printf("原数组:\n");
	InitArray2D(&arr, 4, 4);
	InitFileArray2D(&arr);
	PrintArray2D(&arr);
	printf("修改值后数组:\n");
	SetValue(&arr, 2, 2, 5);
	PrintArray2D(&arr);
	int a = GetValue(&arr, 2, 1);
	printf("查找的值:\n");
	printf("a=%d", a);
	DestroyArray2D(&arr);
	printf("\n");
}

测试结果:

;