当前位置: 技术问答>linux和unix
Linux下C编程,谁能告诉我各种数据类型存储时占几个字节?
来源: 互联网 发布时间:2015-03-08
本文导语: short: 2个 int: 4个 float: 4个 以上是否正确,请指教! | long 4 short 4 int 4 另外,正好前两天做测试,关于结构体所占字节我发现都是按照4的倍数分配 例如 typedef struct _aa { int id; char name...
short: 2个
int: 4个
float: 4个
以上是否正确,请指教!
int: 4个
float: 4个
以上是否正确,请指教!
|
long 4
short 4
int 4
另外,正好前两天做测试,关于结构体所占字节我发现都是按照4的倍数分配
例如
typedef struct _aa {
int id;
char name[25];
}AA;
sizeof(AA)= 32
而
typedef struct _aa {
int id;
char name[29];
}AA;
sizeof(AA)= 36
sizeof()测试时,如果结构体中含有指针则返回地址也是4字节
short 4
int 4
另外,正好前两天做测试,关于结构体所占字节我发现都是按照4的倍数分配
例如
typedef struct _aa {
int id;
char name[25];
}AA;
sizeof(AA)= 32
而
typedef struct _aa {
int id;
char name[29];
}AA;
sizeof(AA)= 36
sizeof()测试时,如果结构体中含有指针则返回地址也是4字节
|
sizeof()跟具体的编译器有关,一般对于32位编译器来说
sizeof(short)=2
sizeof(int)=4
sizeof(float)=4
这只是sizeof,真正的运行时候,由于编译器的优化,里边有对齐的问题,32位机器一般都是4字节对齐的,所以即使你char a;只需要一个字节,下一个char b;还是在第5个字节的地方.
sizeof(short)=2
sizeof(int)=4
sizeof(float)=4
这只是sizeof,真正的运行时候,由于编译器的优化,里边有对齐的问题,32位机器一般都是4字节对齐的,所以即使你char a;只需要一个字节,下一个char b;还是在第5个字节的地方.
|
下面给你一个例子帮你理解
#include
int main(int argc, char *argv[])
{
char a;
char b;
a = 'a';
b = 'b';
exit(0);
}
用GDB反汇编
(gdb) disassemble main
Dump of assembler code for function main:
0x08048324 : push %ebp
0x08048325 : mov %esp,%ebp
0x08048327 : sub $0x8,%esp
0x0804832a : and $0xfffffff0,%esp
0x0804832d : mov $0x0,%eax
0x08048332 : sub %eax,%esp
0x08048334 : movb $0x61,0xffffffff(%ebp)//[ebp]
0x08048338 : movb $0x62,0xfffffffe(%ebp)//[ebp-4]而不是[ebp-1]
0x0804833c : sub $0xc,%esp
0x0804833f : push $0x0
0x08048341 : call 0x8048264
0x08048346 : nop
0x08048347 : nop
End of assembler dump.
#include
int main(int argc, char *argv[])
{
char a;
char b;
a = 'a';
b = 'b';
exit(0);
}
用GDB反汇编
(gdb) disassemble main
Dump of assembler code for function main:
0x08048324 : push %ebp
0x08048325 : mov %esp,%ebp
0x08048327 : sub $0x8,%esp
0x0804832a : and $0xfffffff0,%esp
0x0804832d : mov $0x0,%eax
0x08048332 : sub %eax,%esp
0x08048334 : movb $0x61,0xffffffff(%ebp)//[ebp]
0x08048338 : movb $0x62,0xfffffffe(%ebp)//[ebp-4]而不是[ebp-1]
0x0804833c : sub $0xc,%esp
0x0804833f : push $0x0
0x08048341 : call 0x8048264
0x08048346 : nop
0x08048347 : nop
End of assembler dump.
|
正确
|
CoolQ说得对,这主要是个内存对齐问题,建议参阅,书里有很详细的介绍,会收益非浅
|
最可靠的方法:
编个程序,用sizeof()测试。
编个程序,用sizeof()测试。
|
你看一下/usr/include/sys/types.h就一切都就知道了。:)