① 关于c语言结构体类型的大小
这样才是你的结果
#pragma pack(1)
struct stu
{
}
#pragma pack()
② c语言结构体存储大小
分配内存时,编译器考虑同结构里最宽的元素类型对齐,或4 字节对齐。
struct
{
int i; // 这里 最宽的元素类型 是 int -- 4 字节
char b; // 所以给它分配1字节后,再浪费3个字节,凑成4字节
}numb;
所以一共用8个字节。
③ C语言,结构体数组的长度
C语言不支持动态分配内存,你需要自己分配,大概这样
#include<stdio.h>
#include<stdlib.h>
typdef struct Node
{
int value;
int next;
}Node;
int main()
{
int a;
scanf("%d",&a);
Node *p=malloc(a*sizeof(Node));
.......
}
这样p就相当于Node数组的第一个元素的指针,也可以当作数组名使用了。
④ c语言的结构体类型的长度怎么求
strlen是求字符串长度,遇到\0认为该字符串已结束
⑤ c语言的结构体类型的长度
strlen是求字符串长度的,string length的缩写嘛
你想求大小的话,可以用sizeof(card);
结构体的大小可是一个非常让人头痛的问题啊。。。我反正还是经常对自己的判断不太肯定
我从别的地方给你找了一个说明,你可以参考一下
在缺省对齐下我先给你说下三条准则吧,
【1】结构体变量的首地址能够被其最宽基本类型成员的大小所整除
【2】结构体每个成员相对于结构体首地址的偏移量是成员大小的整数背
【3】结构体的总大小为结构体最宽基本类型成员大小的整数背
以上都是结构体中只有基本类型时的缺省对齐方式,当有嵌套复合成员时,
【2】改为:复合成员相对于结构体首地址偏移量是复合成员最宽基本类型大小的整数背
所以分析你上面的
typedef struct node
{
int a[100];
char b;
}kkk;
先是第一成员400个字节,然后还有个char一个字节,为了满足第第三条准则,即总大小401为最宽基本类型的整数背,明显401不是最宽基本类型int(4)的整数背,所以总大小为404
希望楼主能理解,呵呵
⑥ C结构体存储和长度
个参数:
#pragma pack(8); //这个8是结构体默认的对齐参数,其作用是:
1>当结构体中有变量类型占的长度比这个大,那么该结构的对齐参数就是8;
2>如果结构体中成员的类型都比这个默认值小,那么该结构体的对齐参数就是该结构体中占用空间最长的成员变量的长度,如instruct A;的对齐长度是1(字符变量占1个字节)
根据楼主的输出,楼主的运行环境pack(4),因为A中double占的字符大于4,所以结构体A的对齐参数为4,那么结果就是4+4+4,实际后面两个4是存一个double数据;第二题int a;已经等于4,所以对齐变量为4。
当知道对齐规则后,那么内存是怎么排列的呢?
定义变量的时候先找到一个内存地址,根据计算机的内部结构(我还不是很清楚),会选用一个可用的,而且对对齐变量求余为0的地址作为存储该结构体的地址。
如2题既然对齐变量为4,那么一定会选一个4的整数倍的地址作为存储这个结构体的起始地址,
然后是10个char类型,占10个字节,此时,下面的地址已经不能整除4了,比如8+10=18已经不能整除4,所以会空2个字节,从20开始存储int,正好4个字节,地址变为24,能被4整除,也就是char s[10]和int a,占用了12(有2个空字节)+4=16个字节,由于int a后的地址能被4整除,所以A K,的长度就是A的长度为12,所以B的长度为28。
你可以#pragma pack(8);来修改默认的对齐参数来测试。
⑦ c语言关于结构体长度的问题
. 结构体的sizeof这是初学者问得最多的一个问题,所以这里有必要多费点笔墨。让我们先看一个结构体:struct S1{char c;int i;};问sizeof(s1)等于多少聪明的你开始思考了,char占1个字节,int占4个字节,那么加起来就应该是5。是这样吗你在你机器上试过了吗也许你是对的,但很可能你是错的!VC6中按默认设置得到的结果为8。Why为什么受伤的总是我请不要沮丧,我们来好好琢磨一下sizeof的定义——sizeof的结果等于对象或者类型所占的内存字节数,好吧,那就让我们来看看S1的内存分配情况:S1 s1 = { 'a', 0xFFFFFFFF };定义上面的变量后,加上断点,运行程序,观察s1所在的内存,你发现了什么以我的VC6.0为例,s1的地址为0x0012FF78,其数据内容如下:0012FF78: 61 CC CC CC FF FF FF FF发现了什么怎么中间夹杂了3个字节的CC看看MSDN上的说明:When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment.原来如此,这就是传说中的字节对齐啊!一个重要的话题出现了。为什么需要字节对齐计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,以此类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。让我们交换一下S1中char与int的位置:struct S2{int i;char c;};看看sizeof(S2)的结果为多少,怎么还是8再看看内存,原来成员c后面仍然有3个填充字节,这又是为什么啊别着急,下面总结规律。字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。对于上面的准则,有几点需要说明:1) 前面不是说结构体成员的地址是其大小的整数倍,怎么又说到偏移量了呢因为有了第1点存在,所以我们就可以只考虑成员的偏移量,这样思考起来简单。想想为什么。结构体某个成员相对于结构体首地址的偏移量可以通过宏offsetof()来获得,这个宏也在stddef.h中定义,如下:#define offsetof(s,m) (size_t)&(((s *)0)->m)例如,想要获得S2中c的偏移量,方法为size_t pos = offsetof(S2, c);// pos等于4
⑧ 请问一下:在c语言中结构体数组的最大长度是多少
定义在全局范围内,就是堆分配,只和系统限制有关及内存有关
在局部的话(如子函数内),就和栈有关,一般有限制的
⑨ C语言--结构体大小
这与编译器的编译选项有关,如果按C语言的本意则结果应为401,但很多编译器都对结构类型的成员变量进行了按4字节或8字节对齐,这样做可以提高数据存储速度,对齐后结构的大小就只能是4或8的整数倍。
⑩ C语言结构体及长度问题
a四字节对齐,所以应该是16
b是指针,就是4个字节
你那个答案是16位机器,现在上哪找去。。