结构体里的数组初始化(结构体数组初始化)
本文目录
结构体数组初始化
嗯,位域……
简单来说,位域不能由new初始化,初始化参数会被忽略。
为了说明问题,我特意去反编译了。
先上图:
其实无论你0x1,0x2换成什么,在Debug模式下都是输出13。
为什么是13呢?
原因在于很多编译器对于未初始化的内存都会用0xcdcdcdcd填充(上图所示)。
然后你的位域恰好是最后4位,那个D,就是十进制的13了。
用0xcdcdcdcd填充是编译器为了检查有没有内存未被初始化就使用了的。
如果你在Release模式下,去除这个保护,你会发现结果不同的。
好了,怎么解决?
两种方法:
1
#include 《cstdio》
using namespace std;
struct card
{
unsigned c : 4;
};
int main()
{
card cardGroup = { { 0x1 },{ 0x2 } };
printf("%u %u", cardGroup.c);
return 0;
}
2
#include 《cstdio》
using namespace std;
struct card
{
unsigned c : 4;
card(unsigned x) :c(x) {}
};
int main()
{
card* cardGroup = new card{ { 0x1 },{ 0x2 } };
printf("%u %u", cardGroup.c);
return 0;
}
这两种方法都会强制初始化card,达到效果。
我的环境是VS2015
如何对结构体数组初始化
// 有两种方法可以初始化结构体数组,如下例所示:
#include 《iostream》
#include 《string》
#include 《iomanip》
#include 《memory》
using namespace std;
// custom_type
typedef struct tagStudent{int Id;string Name;}Student;int main(){// 设置左对齐
cout.flags(ios::left);
// 方式1: 适用于提前知道具体数据的情况 Student arrStu1 = {{1, "Name_1"}, {2, "Name_2"}, {3, "Name_3"}, {4, "Name_4"}, {5, "Name_5"}}; cout《《"Method_1:"《《endl;
for (int i=0; i《5; i++){cout《《setw(4)《《"Id:"《《arrStu1.Id《《", "
《《setw(6)《《"Name:"《《arrStu1.Name《《endl;}cout《《endl;
// 方式2: 具体数据可能稍后才能得到的情况 Student arrStu2; memset(arrStu2, 0, sizeof(arrStu2)); cout《《"Method_2:"《《endl;
c语言 在结构体中 初始化其中的数组
结构体是个空架子,是无法“初始化其中的数组”的,只有初始化结构体的对象(即变量)。像你这里可以这么做:在使用这个结构体前写一句struct
bf
x={NULL,NULL,NULL,NULL};,那么x中的所有字符数组就都为空了。
C语言结构体数组初始化的问题
struct Less***
{
int haoma;
char ming;
int chengji;
};
struct Students
{
int num;
char name;
struct Less*** gaoshu;
struct Less*** Eng;
struct Less*** C;
struct Less*** zhengzhi;
struct Less*** PE;
}s1={ 1,"zhang", {100,90,90},{90,90,90},{90,90,90},{90,90,90},{90,90,90} }; //结构体数据,直接用{}括起来就可以
更多文章:
structured time是什么意思(什么是setup time和hold time)
2026年4月6日 01:20
java socket 客户端(java socket 多个客户端连接, 怎分辨是那一位客户端)
2026年4月6日 00:40
mysql和sql语法有区别嘛(mysql的语句和sql语句是一样的吗)
2026年4月6日 00:20
requests库下载及安装(win10怎么安装requests库)
2026年4月6日 00:00
随机生成正负1函数(excel随机函数,生成-1到1之间,不为0的保留两位位小数)
2026年4月5日 23:20





