要确定数据占用多少字节存储,需要认真进行分析,区分起来有如下内容需要注意:
1、是否是简单数据类型。简单数据类型包括系统自带的int、float、double、char、long、long
long、short等,对于这类型数据,要知道占用的存储字节数,只需要对其进行sizeof(类型)即可。
2、复杂数据类型:这类包括数组、联合(union)、结构体。数组的情况有一些特殊,如果你的数组是在作用域内定义,直接sizeof(数组名)可以获取数组所占字节数,但是如果作为参数传入函数,无法使用这种方法。联合所占字节数为其中所有元素中最大的一个所占的字节数。结构体的所占字节数用sizeof(结构体)可以求得。
3、注意:字符串数组单独拿出来讨论,如果你需要一个10字节的字符串数组,一定记得多算一个结束符的位置。
Ⅱ 关于c语言中联合体/共用体中数据存放的问题
你好!!!
首先我们了解联合体的所有成员是在内存中共享一块内存的,在某一时刻只能有一个成员使用这个内存!!!
我们来看看一个例子:
#include <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266
解释如下:
union
{
int i;
char x[2];
}a;
在联合体a中定义了两种数据类型,字符数组x以及整形变量i.其中整形变量是16位的,数组大小为2的字符数组为8X2=16位。如此一来,编译器便会为联合体a在内存中开辟一个16位的空间,这个空间里存储联合体的数据,但是这个空间只有16位,它既是整形变量的数据,也是字符数组的数据。如果你的程序从字符数组的角度解析这个空间,那么它就是两个字符,如果你的程序从整型的角度解析这个空间,那么它就是一个整数。
以你的程序为例子,现在已经开辟了一个16位的空间,然后我们假定现在空间还没有被赋值,为:
00000000 00000000
那么在运行完代码
a.x[0] = 10;
a.x[1] = 1;
之后,16位的空间变为:
00001010 00000001
然后程序运行
printf("%d",a.i);
就是把联合体a当成一个整数来解析,而不是字符串数组。那么这样一来,程序就把这16位变成了一个完整的整数:
(00000001 00001010)二进制 = (266)十进制
注意,你可以看到程序在把16位弄成整数的时候把后面八位放在了前面,前面八位放在了后面。这个反序是计算机存储结构造成的,这个和联合体没有直接关系。如果感兴趣的话可以参考汇编语言。
现在我们来看看,你给的例子:
union dt
{
int a;
char b;
double c;
}data;
此时的联合体所占的内存大小是8个字节,接下来执行:
data.a=5;
此此时内存中就不是空的了,也就不会是你说的是随机数,
但是输出:printf("%lf",data.c);结果是0.000000,这个结果我还不能给你准确的解释。但是我可以肯定这与系统把double转换成int 和int 转化成 double 有关!!!
暂时我只能解释这那多!!!
Ⅲ 数组的大小数组中能够存放多少个数组元素
这个问题 应该这么说:如果定义的是一个简单类型的数组,例如:int my_int_array[100] ; 那么最多能够存放:100个元素,且每个元素的详细大小为:sizeof(int) ;数组的合法存取下标为:my_int_array[0] -- my_int_array[99],如果超过了这个范围,那么就会产生数组越界,程序就会出现错误了。
如果定义的是一个复合类型的数组,例如:结构数组。举例如下:
struct myself_datatype
{
char name[40] ;
int sex ;
int age ;
} myself_data ;
myself_data my_struct_array[100] ;
那么结构数组中的每一个元素所占的空间大小就是:sizeof(myself_data.name) + sizeof(myself_data.sex) + sizeof(myself_data.age) 。