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

你可能感兴趣的:(学习笔记)