我在一些现有代码中发现它,它看起来有些问题,但代码工作正常,如果这段代码有任何欺骗性的话,你能帮忙吗。
为什么在计算结构的大小时忽略两个无符号?
tmsg_sz = sizeof(plfm_xml_header_t) + sizeof(oid_t) + sizeof(char*)
+ sizeof(unsigned) + sizeof(snmp_varbind_t)*5 ;
tmsg = (snmp_trap_t*) malloc(tmsg_sz);
if (!tmsg) {
PRINTF("malloc failed \n");
free(trap_msg);
return -1;
}
memset (tmsg, 0, tmsg_sz);
tmsg->hdr.type = PLFM_SNMPTRAP_MSG;
copy_oid_oidt(clog_msg_gen_notif_oid, OID_LENGTH(clog_msg_gen_notif_oid), &tmsg->oid);
tmsg->trap_type = SNMP_TRAP_ENTERPRISESPECIFIC;
tmsg->trap_specific = 1;
tmsg->trapmsg = strdup("Trap Message");
tmsg->numofvar = 5;
build_snmp_varbind(&(tmsg->vars[0]), facility, STR_DATA_TYPE, sizeof(facility)+1, clog_hist_facility_oid, 14);
build_snmp_varbind(&(tmsg->vars[1]), &sev, U32_DATA_TYPE, sizeof(sev),clog_hist_severity_oid, 14);
build_snmp_varbind(&(tmsg->vars[2]), name, STR_DATA_TYPE, sizeof(name)+1, clog_hist_msgname_oid, 14);
build_snmp_varbind(&(tmsg->vars[3]), trap_msg, STR_DATA_TYPE, strlen(trap_msg)+1,clog_hist_msgtext_oid, 14);
// get system uptime
long uptime = get_uptime();
build_snmp_varbind(&(tmsg->vars[4]), (long*)&uptime, TMR_DATA_TYPE, sizeof(uptime),clog_hist_timestamp_oid, 14);
typedef struct snmp_trap_s {
plfm_xml_header_t hdr;
oid_t oid; /* trap oid */
unsigned trap_type;
unsigned trap_specific;
char *trapmsg; /* text message for this trap */
unsigned numofvar;
snmp_varbind_t vars[0];
} __attribute__((__packed__)) snmp_trap_t;
答案 0 :(得分:0)
编译器努力将多字节数据以各种方式对齐。例如,在int
的架构中,sizeof int == 4
变量可能需要放置在可被4
整除的位置。这可能是一项艰难的要求,或者这可能只会使系统更有效率;这取决于电脑。所以,考虑一下
typedef struct combo {
char c;
int i;
} combo;
根据体系结构,sizeof combo
可能是5,6或最常见的8.交换两个成员,大小应为5.
typedef struct combo2 {
int i;
char c;
} combo2;
但是,combo2
的数组可能具有您不期望的大小:
combo2 cb[2];
cb
的大小很可能是16,因为在combo2[0]
和combo2[1]
之后浪费了3个字节的空间。这使combo2[1].i
从可被4整除的位置开始。
建议按尺寸订购结构的成员; 8字节成员应该在4字节成员之前,然后是2字节成员,然后是1字节成员。当然,您必须了解典型的尺寸,并且您不能处理奇怪的架构,其中字符不会被包装成更大的单词。克雷? 咳嗽咳嗽