目录
static静态局部变量
当函数的返回值是一个数组时,C语言均采用指针的形式进行传参和返回。如果返回的是一个二维数组,且采用循环调用函数的方式接收每一次的数组,会出现以下问题:
首先应当明确,使用了static之后的静态局部变量是声明定义在全局变量区域的,只是其作用域被限制在了定义它的函数中。而函数中返回的将是一个指针,如果这个指针在每一次函数使用时不进行重新分配空间,那么这个指针在内存中的位置是不会发生改变的。而二维数组采用了循环调用函数的方式,这就导致二维数组的每一行都指在了同一个区域,因此上一轮的值就会被下一轮所覆盖,因为下一轮函数在操作时改变了对应内存中的数据。
解决方法是在每一轮中对返回值进行赋值之前,对其用malloc重新分配空间
二维数组的循环赋值指的是:
for(i=0;i<m;i++)
{
ct_cbc[i]=(int*)malloc(sizeof(int)*64);
ct_cbc[i]=en_des(bar[i],i);//en_des是自定义函数,返回类型是一个int指针
}
以上所述原理如图:
(该图仅反映本bug要描述的问题,不完全对应操作系统的实际存储)
如图所示,若静态局部变量在操作时不进行重新分配空间,则二维数组的每一行都将指向同一存储区,因此会出现被覆盖的现象。
结论
在函数中使用静态局部变量的数组,且返回值是该数组时,每一次调用该函数都需要重新为该变量分配空间!!!