目录
动态数组与静态数组的详细区别
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");
}
测试结果: