C语言中如何填充全局结构体数组?字符串赋值失效排查
问题分析与解决
你这段代码的问题出在字符数组的赋值方式和数组下标越界两个关键点上:
1. 数组下标越界
你的primaryAccountNumber是长度为20的uint8_t数组,C语言数组下标从0开始,所以有效下标范围是0~19。你写的primaryAccountNumber[20]已经超出了数组的合法访问范围,属于未定义行为,会破坏内存数据。
2. 字符数组不能直接用=赋值字符串常量
C语言中,字符数组是一片连续的内存空间,不能直接用赋值运算符=把字符串常量(比如"1234567891234567")直接赋值给它。这种写法在语法上是不允许的,编译器会报错。
正确的填充方式
你需要使用C标准库的strcpy函数来完成字符串复制操作(记得包含头文件<string.h>),或者在数组初始化时直接赋值。
方式一:使用strcpy填充
#include <string.h> // 填充全局数组 accountsDB[0].balance = 20000; strcpy((char*)accountsDB[0].primaryAccountNumber, "1234567891234567"); accountsDB[1].balance = 50000; strcpy((char*)accountsDB[1].primaryAccountNumber, "9872653461728839"); accountsDB[2].balance = 40000; strcpy((char*)accountsDB[2].primaryAccountNumber, "6873645738467382"); accountsDB[3].balance = 28000; strcpy((char*)accountsDB[3].primaryAccountNumber, "3872634547838276"); accountsDB[4].balance = 3000; strcpy((char*)accountsDB[4].primaryAccountNumber, "1283764957873637"); accountsDB[5].balance = 100000; strcpy((char*)accountsDB[5].primaryAccountNumber, "3485793029384758"); accountsDB[6].balance = 30000; strcpy((char*)accountsDB[6].primaryAccountNumber, "8746330283748393");
注:因为
primaryAccountNumber是uint8_t类型数组,而strcpy的参数是char*,所以需要强制类型转换。如果你的编译器中uint8_t和char是等价的(大部分嵌入式环境都是),也可以直接使用。
方式二:初始化时直接赋值(仅适用于定义数组时)
如果是在定义accountsDB的时候直接初始化,可以这么写:
ST_accountsDB_t accountsDB[255] = { {20000, "1234567891234567"}, {50000, "9872653461728839"}, {40000, "6873645738467382"}, {28000, "3872634547838276"}, {3000, "1283764957873637"}, {100000, "3485793029384758"}, {30000, "8746330283748393"}, // 其余元素会被自动初始化为0 };
这种方式只在数组定义的时候有效,后续不能再用这种方式赋值。
内容的提问来源于stack exchange,提问作者Omar A. Abdelazim
相关产品推荐
相关产品推荐

