×

size

C语言结构体的size,为什么不等于它的所有成员size之和?java.lang.NegativeArraySizeException,怎么解决阿

admin admin 发表于2023-11-15 14:17:54 浏览39 评论0

抢沙发发表评论

本文目录

C语言结构体的size,为什么不等于它的所有成员size之和

谢邀。

结构体在C语言程序开发中,是不可或缺的语法。不过,相信不少C语言初学者遇到过这样的问题:为什么结构体的 size 有时不等于它的所有成员的 size 之和呢?

C语言结构体大小等于它的所有成员大小之和吗?

举例来说,假设有结构体,它的C语言代码如下,请看:

我们继续编写C语言代码,依次输出成员 s,i,c 占用内存空间的大小,相关代码很简单,请看:

编译并执行这段C语言代码,得到如下输出:

那么按理说,结构体 x 占用的内存空间应该等于 2+4+1=7 字节,但是似乎实际结果与我们的预期并不一致:

上面这行C语言代码输出的结果是 12!这是怎么回事呢?

解析

程序输出的结果与我们的预期不一致,原因在于“对齐机制”。如果将结构体 x 看作是一个容器,鉴于成员 s,i,c 的长度参差不齐,C语言编译器不得不“填充”一些额外的空间,以满足“对齐机制”。

数据结构是否对齐不仅影响C语言程序的性能,有时甚至还会带来意想不到的错误,例如访问未对齐的数据,可能会导致硬件方面的问题 (SIGBUS,总线错误),导致性能下架,以及破坏一些操作的原子性等并发安全保障。

所以,C语言编译器在处理结构体时,如果没有特别的指定,一般都会填充一些字节,以确保不违背对齐机制。以上面的结构体 x 为例,初学者可能会认为它的成员在内存中的布局如下:

但是,如果编译器按照下面布局,处理器访问之将更加方便:

不过,这样排列结构体 x 的成员,会空出一些空间,对于处理器来说,小心的跳过这些空间还是有些麻烦,于是大多数C语言编译器都会像下面这样填充空穴:

这样一来,整个结构体 x 占用内存的空间,其实就是成员 i 占用空间的 3 倍了,也即 12 字节。

事实上,我们可以通过排列结构体 x 成员的顺序,来优化其占用内存的大小,例如:

小结

本节主要讨论了C语言中结构体大小并不一定等于它所有成员大小之和的原因,应该注意,结构对齐在C语言标准中是 implementation defined,不同的C语言编译器可能选择不同的数据对齐方式,从而导致不同和不兼容的数据布局。因此,在使用不同编译器开发C语言程序时,了解编译器是如何对齐数据是很重要的。

一些编译器可以指定结构对齐的方式,例如 #pragma 语句。

java.lang.NegativeArraySizeException,怎么解决阿

一般用于表单提交时候,用post来提交,用get就会出现这个异常:int arr = new int;int i = arr;public class TestNull {public static void main(String args) {Student stu = new Student(1,“a“,“b“);Teacher tea = new Teacher();tea.setId(1);tea.setName(“bbb“);tea.setStu(stu);stu = null;//《span style=“color: #FF0000;“》这里可以优化内存么《/span》System.out.println(tea.getStu().toString());System.out.println(tea.toString());//}}

C语言中sizeof与strlen的区别是什么

一、指代不同

1、sizeof:用于获取字符串的长度,是处理字符串的重要工具。

2、strlen:所作的是一个计数器的工作。

二、规则不同

1、sizeof:可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,不需要用圆括号。

2、strlen:从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值。

三、用法不同

1、sizeof:sizeof( type_name ); // sizeof( 类型 );编译时起作用,而不是运行时。

2、strlen:extern unsigned int strlen(char *s);返回s的长度,不包括结束符NULL。

参考资料来源:百度百科-sizeof()

参考资料来源:百度百科-strlen

sizeof和strlen在c语言的区别是什么

sizeof和strlen在c语言的区别是:用法不同。

sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。sizeof是算符,strlen是函数。sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以“\0”结尾的。

strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

函数调用:

sizeof(函数名())

sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用,举例来说定义如下函数:

int myprint ()

{undefined

printf(“hello\n”);

return 0;

int main()

{undefined

printf(“%d”,sizeof(mypaint()));

return 0;

结果只打印函数返回类型的sizeof值,并没有打印hello说明函数myprint并没有调用。

c语言中strlen 与sizeof有什么区别

strlen是返回字符串的长度。而sizeof,却是用来取得变量或类型所占用的内存大小的。这个a数组的字符串长度为4(末尾的\0是不计入字符串长度的),但a是10个单位的char型,它占用的内存空间是10*sizeof(char),为10.sizeof返回的数量的单位是Byte.