结构体内数组大小不定
来源:互联网 发布:js dom事件 编辑:程序博客网 时间:2024/05/13 13:26
/***********今天写代码时候遇到一个问题需要写到结构体数组成员里面,觉得提前分配全局变量数组太大,用时分配再说************/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct
Test
{
int
Msgtype;
char
szMsg[];
};
int
main(
void
)
{
int
a = 0;
struct
Test t;
t.Msgtype = 45;
strcpy
(t.szMsg ,
"b"
);
printf
(
"%s, %d\n"
, t.szMsg, a);
printf
(
"%#x, %#x\n"
, &a, t.szMsg);
return
0;
}
先说明下这个结构体
struct
Test
{
int
Msgtype;
char
szMsg[];
};
网上找到说明
char
szMsg[];
这个特性是C99特有的一个新特性,称为伸缩型数组成员。利用这一特性可以声明最后一个成员是一个具有特殊属性的数组的结构。这个结构体sizeof(
struct
Test
)大小只有4,说明
char
szMsg[];没有分配内存的。
所以只能用时在堆里面分配。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
struct
Test
{
int
Msgtype;
char
szMsg[];
};
int
main(
void
)
{
int
a = 0;
struct
Test t;
t.Msgtype = 45;
strcpy
(t.szMsg ,
"b"
);
printf
(
"%s, %d\n"
, t.szMsg, a);
printf
(
"%#x, %#x\n"
, &a, t.szMsg);
return
0;
}
上面代码结果用gcc编译打印出来会是a = 98,即ascii吗b的值。
strcpy
(t.szMsg ,
"bcde"
);
就会出现段错误。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tpyedef struct
{
int
Msgtype;
char
szMsg[];
}Test;
int
main(
void
)
{
int
a = 0;
Test *t = (Test*)malloc(sizeof(int)+20*sizeof(char));
t->Msgtype = 45;
strcpy
(t->szMsg ,
"bcd"
);
printf
(
"%s, %d\n"
, t.szMsg, a);
printf
(
"%#x, %#x\n"
, &a, t.szMsg);
return
0;
}
- 结构体内数组大小不定
- 结构体内存大小
- 结构体内引用数组
- 结构体内存大小总结
- c++结构体内存大小
- 结构体和联合体的大小,结构体内存对齐的原因、规则以及柔性数组
- 结构体内不定长数组初始化,error: #1077: an initializer cannot be specified for a flexible array member
- 给结构体内数组赋值
- 指针组合(如指针数组)的区分及其结构体内存大小的计算
- 结构体内存大小的问题
- sizeof求结构体内存大小
- 重载结构体内<号 定义结构体大小比较
- C语言结构体内存对齐(计算结构体内存大小)
- 结构体与byte数组转换/结构体内定长数组
- C结构体内存分配及sizeof大小总结
- C结构体内存分配及sizeof大小总结
- 结构体内存大小的求法(内存对齐)
- 关于结构体内存对齐以及大小端
- kingdeeBOS7.5启用dep无效问题
- 重视细节,方能得到认可
- 判断一个数是否是水仙花数
- 优秀的程序员和一般的程序员差别在哪?
- libevent入门教程:Echo Server based on libevent
- 结构体内数组大小不定
- 我的2012
- 将程序打包成jar包在控制台调用同时传入参数
- Google 的十大信条
- 事半功倍,事倍功半?
- 服务器端linux发行版的选择
- 项目组CentOS开发环境的搭建
- 我的敏捷布道
- 创建本地技术社区的构想