C语言利用结构体达到数组深拷贝的小技巧

大家有一定C语言基础的人都清楚,在C语言中数组是不能直接赋值的 例如

int a[5] = {1,2,3,4,5};
int b[5];
b = a;

像这样的代码,其实编译是不通过的,C语言不支持这样的数组赋值的语法。
但是,今天我们就要介绍一种省事的方法来让C语言数组可以直接赋值。代码如下:

typedef struct{
	int a[10];
}S;

S s1 = { {1,2,3,4,5,6,7,8,9,0} }, s2;
s2 = s1;

然后编译通过,有些有C语法基础的人可能就说了 , 这是简单的浅拷贝 (值拷贝),意思就是s1,s2中的a数组地址相同,然而我们不能想当然,事实真的是这样的吗?让我们来看看吧。

很显然,在vs调试下验证了,上面的说法是不正确的,这样写的数组赋值不是简单的浅拷贝,而是会另外开辟一段空间,然后将内容一一拷贝。我们再尝试着改变s2中部分的元素的值,继续验证一下我们的说法。
在这里插入图片描述
改变s2数组中的值不会导致s1数组中的值的变化,这就更加证明了我们的说法。
因此,我们有了一个简单的可以实现数组“自动”深拷贝的编程技巧–将数组用结构体包装起来。当然了,在我们需要数组的容量特别大的时候,还是不要使用这种方法,因为这样子预先给定大小的数组是在栈上开辟的空间,而栈的空间相对有限(在linux系统下使用ulimit选项查看进程栈空间大约为8M),不适合用于数据量特别大的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值