C_含数组成员的结构体变量之间的赋值

本文探讨了在C语言中,含有数组成员的结构体变量之间的赋值过程。通过实例说明,当一个结构体变量赋值给另一个同类型的结构体变量时,实际上是拷贝了对应的内存内容,包括数组成员。

含有数组成员的结构体的变量之间可以进行赋值,示例如下:

#include<stdio.h>
#define N 20

typedef struct
{
	char cd[N];
	int start;
}HCode;

int main(void)
{
	HCode hc_arr[20];
	HCode hc = {"this is a string", 12};
	hc_arr[0] = hc; 
	printf("%s\n%d\n",
	hc_arr[0].cd, hc_arr[0].start);
	return 0;
}

以上代码在ISO C90上编译通过,并且能够正常输出

原因是

结构体描述的是的一块连续内存的内存布局,同类型的一个结构体变量给另一个结构体变量赋值,使用等号编译不会有任何问题,其效果显然也和人直觉认为的一样,拷贝对应内存。
文字转自https://blog.youkuaiyun.com/thisinnocence/article/details/82945938

也就是说,结构体描述的是一整块连续的内存空间,即数组成员的内存空间也被包含在结构体的内存空间中,进行赋值操作时,将相应内存位置上的内容进行拷贝即可。

### 结构体变量赋值方法 在C语言中,结构体(`struct`)是一种用户自定义的数据类型,可以包多个不同类型的成员。对结构体变量进行赋值时,可以通过初始化或赋值操作符进行。 #### 对结构体变量进行初始化 在定义结构体变量时,可以直接对其进行初始化。例如: ```c struct DAY { int year; int month; int day; }; struct DAY today = {2023, 2, 15}; ``` 上述代码定义了一个名为 `today` 的 `DAY` 类型结构体变量,并将其成员 `year`、`month` 和 `day` 分别初始化为 `2023`、`2` 和 `15` [^2]。 #### 多维数组作为结构体成员的初始化 当结构体成员是多维数组时,初始化语法需要特别注意。对于二维数组,初始化时可以通过嵌套的大括号来表示每一行的元素。例如: ```c #include <iostream> using namespace std; struct mat { long long m[5][5]; }; int main() { mat a = {{ {0, 0, 0, 0, 0}, // 第一行 {0, 0, 0, 1, 0}, // 第二行 {0, 1, 0, 0, 0}, // 第三行 {0, 0, 1, 0, 1}, // 第四行 {0, 0, 0, 1, 1} // 第五行 }}; return 0; } ``` 在这个例子中,结构体 `mat` 的成员 `m` 是一个 5x5 的二维数组。初始化时通过嵌套的大括号,将每一行的值依次指定,从而完成对整个二维数组的初始化 [^1]。 --- ### 成员变量赋值 除了在定义时进行初始化外,还可以在程序运行过程中对结构体成员变量进行赋值。例如: ```c struct DAY { int year; int month; int day; }; int main() { struct DAY today; today.year = 2023; today.month = 2; today.day = 15; return 0; } ``` 上述代码中,结构体变量 `today` 在定义后通过成员访问运算符 `.` 进行逐个赋值。 --- ### 数组类型不能直接赋值的原因和解决办法 #### 原因 在C语言中,数组名本质上是一个指向数组首元素的指针常量。由于数组名不可修改,因此无法直接使用赋值操作符(`=`)对整个数组进行赋值。例如以下代码会报错: ```c int arr1[5] = {1, 2, 3, 4, 5}; int arr2[5]; arr2 = arr1; // 错误:数组不能直接赋值 ``` 这是因为 `arr2 = arr1;` 实际上试图修改 `arr2` 的地址,而数组名是不可修改的常量指针。 #### 解决办法 1. **逐个元素赋值** 可以通过循环逐个复制数组中的元素: ```c int arr1[5] = {1, 2, 3, 4, 5}; int arr2[5]; for (int i = 0; i < 5; i++) { arr2[i] = arr1[i]; } ``` 2. **使用 `memcpy` 函数** 使用标准库函数 `memcpy` 可以一次性复制数组内容: ```c #include <string.h> int arr1[5] = {1, 2, 3, 4, 5}; int arr2[5]; memcpy(arr2, arr1, sizeof(arr1)); ``` 3. **封装数组结构体中** 将数组封装到结构体中后,可以直接对结构体变量进行赋值: ```c struct ArrayWrapper { int arr[5]; }; int main() { struct ArrayWrapper a1 = {{1, 2, 3, 4, 5}}; struct ArrayWrapper a2 = a1; // 直接赋值有效 return 0; } ``` 这种方法利用了结构体的整体赋值特性,避免了直接对数组进行赋值的问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值