关于二维数组函数返回时上一轮被覆盖的问题(记录一个de了两个小时的bug)

目录

static静态局部变量

结论


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要描述的问题,不完全对应操作系统的实际存储)

如图所示,若静态局部变量在操作时不进行重新分配空间,则二维数组的每一行都将指向同一存储区,因此会出现被覆盖的现象。

结论

在函数中使用静态局部变量的数组,且返回值是该数组时,每一次调用该函数都需要重新为该变量分配空间!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值