利用C/C++编写程序时,在函数中申请数组空间并返回给其他函数时需要注意:
如果是在函数中直接定义,如int arry[10][10];并return arry,这样的做法可能会造成数组内部数据紊乱,即原来的内存被覆盖
测试代码:
#include<stdio.h>
int n = 10;
int *test()
{
int arry[n];
for(int i = 0;i < n;i++)
{
arry[i] = 1;
}
for(int i = 0;i < n;i++)
{
printf("%d ",arry[i]);
printf("\n");
}
printf("数组在test函数中的地址:%p\n",&arry);
return arry;
}
int main()
{
int *temp = test();
printf("数组在main函数中的地址:%p\n",&temp[0]);
for(int i = 0;i < n;i++)
{
printf("%d ",temp[i]);
printf("\n");
}
return 0;
}
运行效果:
解决方法1:在main函数中声明数组,将地址传入函数中,利用地址来对数组进行修改,测试代码如下:
#include<stdio.h>
int n = 10;
void test(int *arry)
{
for(int i = 0;i < n;i++)
{
arry[i] = 1;
}
for(int i = 0;i < n;i++)
{
printf("%d ",arry[i]);
printf("\n");
}
printf("数组在test函数中的地址:%p\n",&arry);
}
int main()
{
int temp[n];
test(temp);
printf("数组在main函数中的地址:%p\n",temp[0]);
for(int i = 0;i < n;i++)
{
printf("%d ",temp[i]);
printf("\n");
}
return 0;
}
运行效果:
解决方法2:使用malloc申请内存,测试代码如下:
#include<stdio.h>
#include<stdlib.h>
int n = 10;
int *test()
{
int *arry;
arry = (int*)malloc(sizeof(int)*n);
for(int i = 0;i < n;i++)
{
arry[i] = 1;
}
for(int i = 0;i < n;i++)
{
printf("%d ",arry[i]);
printf("\n");
}
printf("数组在test函数中的地址:%p\n",&arry);
return arry;
}
int main()
{
int *temp = test();
printf("数组在main函数中的地址:%p\n",&temp[0]);
for(int i = 0;i < n;i++)
{
printf("%d ",temp[i]);
printf("\n");
}
return 0;
}
运行效果:
在实际中使用malloc函数时需要使用free函数一起使用,需要释放内存,这里程序较短,所以我就没有添加。
扩展知识:二维数组利用malloc函数进行申请空间的方法:
创建一个n*n的二维数组的方法:
int n;
int** input()
{
scanf("%d",&n);
int **arry;
arry = (int **)malloc(sizeof(int *)*n);
for(int i = 0;i < n;i++)
{
arry[i] = (int *)malloc(sizeof(int)*n);
}
for(int i = 0;i < n;i++)
{
for(int j = i+1;j < n;j++)
{
scanf("%d",&arry[i][j]);
}
}
return arry;
}