2 alechy alechy 于 2014.03.19 09:50 提问

C++ linux Typedef 定义数组大小判断

头文件内定义了:
typedef struct {
unsigned char headtag;
unsigned int ipacket;
unsigned short packetLen;
unsigned short checkcode;
} tagUDPHead;

cpp 文件里面:
159 cout<<"tagUDPHead:"<<sizeof(tagUDPHead)<<endl;
(gdb) n
tagUDPHead:12
(gdb) p sizeof(unsigned char)
$1 = 1
(gdb) p sizeof(unsigned int)
$2 = 4
(gdb) p sizeof(unsigned short)
$3 = 2

怎么加起来应该是9,为什么打印结果是12呢?

我继续修改cpp,下面是GDB的显示:
168 cout<<"tagUDPHead1:"<<sizeof(tagUDPHead1)<<endl;
(gdb) l 158
153 m_SocketID = -1;
154 }
155 }
156
157 struct tagUDPHead1 {
158 unsigned char headtag;
159 unsigned int ipacket;
160 unsigned short packetLen;
161 unsigned short checkcode;
162 } ;
(gdb) n
tagUDPHead1:12
169 cout<<"headtag:"<<sizeof(a.headtag)<<endl;
(gdb)

headtag:1
170 cout<<"ipacket:"<<sizeof(a.ipacket)<<endl;
(gdb)

ipacket:4
171 cout<<"packetLen:"<<sizeof(a.packetLen)<<endl;
(gdb)

packetLen:2
172 cout<<"checkcode:"<<sizeof(a.checkcode)<<endl;
(gdb)

checkcode:2

1个回答

alechy
alechy   2014.03.19 10:06

自己弄明白了,原来是linux字节对对齐问题:
详细:http://blog.chinaunix.net/uid-26544753-id-3364725.html

只要在定义前加一个
#pragma pack(1)
typedef struct
{
unsigned char headtag; //'#'
unsigned long ipacket; //当前包号,用以确认包的连续性及丢包情况,每天起始包从0开始
unsigned short packetLen; //当前UDP包的长度
unsigned short checkcode; //对除包头外的内容的CRC16校验
} tagUDPHead;
#pragma pack()

就OK了.

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中利用typedef定义一个数组类型
下述代码段参考了Google ProjectTango#include <iostream> #define TANGO_UUID_LEN 37 typedef char TangoUUID[TANGO_UUID_LEN]; int main( ) { TangoUUID arr; // 定义这个定长度数组 arr[0] = 'a'; std::cout << arr[0
typedef 定义数组类型用法
今天看Weiss的《数据结构与算法分析》看到一条typedef语句,不明白其意义。 typedef struct TableEntry Table[ NunVertex ]; 通过查看《 C Primer Plus 》中typedef的相关用法,找到答案。 typedef 关键字有如下用法 typedef int arrs[5]; typedef arrs * p_
C语言 数组 结构体 typedef
// //  main.c //  C数组一维数组 、二维数组、结构体  typedef:重命名 4  // //  Created by  on 12-12-5. //  Copyright (c) 2012年 __MyCompanyName__. All rights reserved. // #include #include #include /
定义数组指针的三种方法
1)通过数据类型定义数组指针:  typedef int(ArrayType)[5];  int *a ArrayType* pointer; 2) 声明一个数组指针类型  typedef int (*MyPointer)[5];  MyPointer myPoint; 3)直接定义: int (*pointer)[n];    pointer 为数组指针变量名  t
用typedef来定义数组
#include<stdio.h> #include<stdlib.h> #include<iostream>/* 2017年3月25日20:26:43 测试typedef和数组的用法 现在已经知道了,typedef能用来起别名,比如,typedef int ABC;那么,就好像int 的别名就是ABC. 在main中需要使用int 的地方,全部都可以用ABC来代替。
Linux c 数组大小的限制
由于在处理一个大文件时,需要使用到一个很大的数组。然而,运行是显示报错。 #include #include int main() { int length = 10000000; char block[length]; memset(block,0,sizeof(block)); return 0; } Segmentation fault (core dumped)
typedef 数组 详解一目了然
typedef到处都是,但是能够真正懂得typedef使用的不算太多。对于初学者而言,看别人的源码时对到处充斥的typedef往往不知所错,而参考书又很少,所以在此给出一个源码,供大家参考   #include #include   /* 避免Visual C的
typedef 一个二维数组,用这个数组定义指针
翻阅笔记系列。。。typedef int Path[10][10];Path* p;此时的 p 是指针数组还是数组指针呢????我总是记不住。p 是一个指针,指向一个二维数组,所以p是数组指针;使用: (*p)[2][4] = 6;
C语言_根据用户输入确定新建的数组大小
在程序中经常要根据用户输入新建数组。但是c语言中不允许非常量成为新建数组时表示大小的下标       for example:       int line;       int col;       scanf("%d,%d",&line,&col);       int p[line][col];//这样是不允许的!!!!!
用typedef定义数组
 看《effetive c++》,发现未曾用typedef定义过数组,赶紧google学习考证下: 可以此代码验证: 23 #include "stdio.h" 24 #include "stdlib.h" 25  26 #define NUM 100 27  28 int main() 29 { 30     typedef char Adds[N