C语言关于动态创建数组的问题,以及如何传递‘以变量定义长宽的二维数组’

C语言关于动态创建数组的问题

C语言的数组设置完应该进行初始化,不然会出现补不可预测的bug

int arr[100] = {0};

C语言中由变量动态创建的数组需要初始化,初始化方式和固定长度的一致

C语言中字符数组可以不初始化,如果不初始化会存储一个类似于α的东西和a很像。

C语言关于如何传递‘以变量定义长宽的二维数组’

前言

众所周知,C语言传递二维数组这件事是很容易完成的(在二维数组的长度已经确定的情况下),但是很多时候,为了优化代码,节省空间,我们需要自定义长度和宽度的二维数组,eg:用户自定义输入长宽,然后创建二维数组。然后传入数据。

这个时候,由于我们事先并不知道二维数组的长宽,所以这个时候编写的函数如果想要按照原来的方式以二维数组为参数,那么我们的子函数便不知道应该开辟多大的空间,就会报错。

解决方案

通过创建一个二级指针来实现二维数组的传递.
优点:易于理解,而且在函数间传递起来较为方便.
缺点:创建和释放比较麻烦.

#include <stdio.h>
#include <stdlib.h>

int a(int hei,int wide, int **arr)//打印数据
{
for (int i = 0; i<hei; i++)
{
for (int j =0; j<wide; j++)
{
printf("%d", arr[i][j]);
}
putchar('\n');
}
return 1;
}

int main()
{
int hei, wide;
printf("输入hei:");//自定义
scanf("%d", &hei);
printf("输入wide:");
scanf("%d", &wide);//
int **arr = (int **)malloc(sizeof(int *)*hei);
for (int i = 0; i< hei; i++)
{
arr[i] = (int *)malloc(sizeof(int)*wide);
}


for (int i = 0; i<hei; i++)
{
for (int j =0; j<wide; j++)
{
scanf("%d", &arr[i][j]);
}
}
a(hei, wide, arr);
for (int i = 0; i<hei; i++)
{
free(arr[i]);
}
free(arr);
return 0;
}

通过二级指针进行传递,这样在子函数中不需要开辟空间,当然我们需要在创建二级指针的时候,手动申请空间,通过malloc函数(包含在stdlib.h头文件中),在堆上申请空间,具体申请步骤看上面代码。

这样就可以将二维数组进行传递了。

注意:别忘记free掉申请的空间,不然会造成程序使用中的内存泄漏。