怎样得到结构体的实际大小值??
typedef struct _msg
{
char cmd[10];
char addition[10];
char content[1024];
}Message;
Message msg;
strcpy(msg.cmd , "11");
strcpy(msg.addition, "12");
strcpy(msg.content, "13");
用sizeof(Message)或者sizeof(msg)得到的只是定义结构体时的大小:1044;
怎样才能得到msg的实际大小:6 呢?
问题点数:20、回复次数:23Top
1 楼junguo(junguo)回复于 2005-08-04 10:49:52 得分 1
你的msg就是1044啊!content不管它里面的字符串是多长,它的大小都是已经分配了的!
如果你想得到字符串的长度,可以用strlen来计算!Top
2 楼oo(为了名副其实,努力学习oo技术ing)回复于 2005-08-04 10:50:44 得分 1
本来就是1044,
你的6是怎么得来的?Top
3 楼dirdirdir3(风)回复于 2005-08-04 10:53:07 得分 1
msg的实际大小也是1044啊,只不过有些空间为0而已。
要得到6只能你自己进行计算了。Top
4 楼seu07201213(【_】〖汪洋中的一片叶子〗≈^︵^≈)回复于 2005-08-04 10:56:33 得分 0
6 指的是里面字符串的总长度. 难道先要转换成char ,再用strlen ??Top
5 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-04 10:57:50 得分 1
strlen(msg.cmd)+strlen(msg.addition)+strlen(msg.content)Top
6 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-04 10:58:33 得分 0
最后再加上3.Top
7 楼XBox360(菜)(鸟)回复于 2005-08-04 11:15:06 得分 1
sizeof肯定是1044了Top
8 楼jixingzhong(瞌睡虫·星辰)回复于 2005-08-04 11:36:33 得分 1
strlen(msg.cmd)+strlen(msg.addition)+strlen(msg.content)
这个就是你要的 6
由于是数组形式 后面没有 '\0‘
这个就是你要的结果了 不需要 +3 了Top
9 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-04 11:45:35 得分 1
后面有'\0'的,你自己试一下就知道了。
先把msg.cmd全部用1填充,然后strcpy(msg.cmd , "11");你就知道了,msg.cmd[2]='\0'。Top
10 楼bingbox_1984(苦丁茶)(我只喜欢CC)回复于 2005-08-04 12:31:36 得分 1
strlen(msg.cmd)+strlen(msg.addition)+strlen(msg.content)
strlen(msg.cmd)==2
........
.......
Top
11 楼kobefly(科比--网络学习中)回复于 2005-08-04 13:08:46 得分 0
??Top
12 楼afx_swallow(足球和啤酒)回复于 2005-08-04 13:11:29 得分 1
怎么会是6呢?Top
13 楼MiloChin(游荡者)回复于 2005-08-04 13:26:36 得分 1
I think the poster means the actual size of variable msg in memory. Variable msg is allocted 1044 bytes once the code is executed, so whatever string you assign to msg.content, the actual size of variable msg is always 1044 bytes in memory, even only a character "a" in msg.content.Top
14 楼MiloChin(游荡者)回复于 2005-08-04 13:31:52 得分 1
Addon: There's a difference between sizeof() and strlen(). Sizeof() calculates the size of a variable in memory, while strlen() just calculates how many characters a character array(a string) has.
I guess the poster is just confused with these 2 functions.Top
15 楼lxk_cool()回复于 2005-08-04 15:13:15 得分 1
不懂,请教一下
#include<iostream>
using namespace std;
struct ss{
int i;
int c[10];
char d[5];
};
int main()
{
ss a;
cout<<sizeof(a)<<endl;//?????? 52
cout<<sizeof(a.c)<<" "<<sizeof(a.i)<<" "<<sizeof(a.d)<<endl;
//40 4 5 不是49么
return 0;
}Top
16 楼MiloChin(游荡者)回复于 2005-08-05 11:50:18 得分 1
这个问题和内存边界对齐有关,按照32位字长的机器而言,通常会给结构变量分配4个字节的倍数大的内存。
a.i变量和a.c数组内存的分配大小是4的倍数,但是a.d字符数组的话只占用5个字节,在内存里的储存结构是这样安排的:
1111 1000
前面5个1代表字符数组的内存分配地址,后面的3个字节0也系统额外分配给结构a变量的内存地址,为了符合边界对齐(内存寻址机制),但结构变量a将放弃对这3个字节的利用,这也就是说要白白浪费这3个字节,这就是为什么sizeof(a)返回52个字节,要比49多3个字节的原因,因为49不是4的倍数。
这种边界对齐机制有时会造成内存浪费,特别是在有上千个结构数组的时候,。Top
17 楼antijpn(antijpn)回复于 2005-08-05 15:09:16 得分 1
根本没有可能得到结构体的真实大小,只能得到存储映像的大小。
对于bit field,不看struct的定义是无法获知大小的Top
18 楼liuhaimiao()回复于 2005-08-05 15:09:16 得分 1
虽然sizeof的返回大小是1044,但实际占用的空间大小有可能大于1044
这是因为内存对齐的原因Top
19 楼ruiding(瑞丁)回复于 2005-08-05 15:53:27 得分 1
请问 这条语句#pragma pack (1)
是表示编译器不考虑字节对齐方式,还是表示编译器按一个字节对齐.
两者能等同吗?Top
20 楼InToTheSea(编程浪子)回复于 2005-08-06 10:33:14 得分 1
#pragma pack (1)
语句表示强制让编译器按一个字节对齐Top
21 楼ruiding(瑞丁)回复于 2005-08-07 15:13:16 得分 1
强制让编译器按一个字节对齐
和编译器不考虑字节对齐方式能等同吗....Top
22 楼tufaqing()回复于 2005-08-08 13:20:49 得分 1
vc不是紧凑方式对齐的,他是以结构里的最大存储类型的整数倍来分配的。
struct ss{
int i;
int c[10];
char d[5];
};
ss有两个类型int和char,按sizeof(int) = 4为单位分配,4 < sizeof(ss.d) < 8,故给他分配8
char d[5], d[6], d[7], d[8]都分配8, char d[9]就分配12了。
struct tt {
double a;
int b;
int c;
char d;
};
sizeof(tt) = 8 + 8 + 0 + 8 = 24; ( b,c 刚好占一个double长)
Top
23 楼tufaqing()回复于 2005-08-08 13:28:06 得分 1
struct tt1 {
double a1;
double a2;
double a3;
int b;
int c;
char d;
};
struct tt2 {
double a1;
int b;
double a2;
int c;
double a3;
char d;
};
sizeof(tt1) = 8 + 8 + 8 + 8 + 0 + 8 = 40;
sizeof(tt2) = 8 + 8 + 8 + 8 + 8 + 8 = 48;
Top




