看看下面代码是否有问题?
void getval(int *pi)
{
int i;
pi = (int *)malloc(10 * sizeof(int));
for (i = 0; i < 10; i++)
{
pi[i] = i;
}
}
int main()
{
int *pi;
int i;
getval(pi);
for (i = 0; i < 10; i++)
{
printf("%d/n", pi[i]);
}
free(pi);
return 0;
}
这是一类出镜率很高的面试题,很多人找不到问题的根本所在,或者在自己写的代码中也犯过这样的错误。
getval函数中的形参pi给分配了内存,似乎没有问题,函数返回后,main中的循环打印出分配的值,然后释放
但实际上这个malloc内存分配返回的内存空间只有getval的形参pi知道,而main中的pi是不知道的,也就是形参的指向的地址空间变了,而实参没有跟着变花,所以main中打印输出和free会出错
如果想通过函数参数返回函数内部进行的内存分配的地址,应该如下程序所示
void getval(int **ppi)
{
int i;
int *pi;
pi = (int *)malloc(10 * sizeof(int));
for (i = 0; i < 10; i++)
{
pi[i] = i;
}
*ppi = pi;
}
int main()
{
int *pi;
int i;
getval(&pi);
for (i = 0; i < 10; i++)
{
printf("%d/n", pi[i]);
}
return 0;
}