sizeof的用法
2007-12-02 17:58:36| 分类: 记事本_日积月累 |字号 订阅
malloc/new 用的时候就必须指定大小的
这里有个sizeof的用法,好好学下
二、由几个例子说开去。
第一个例子: char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到\0为止之前
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''\0''结尾的
char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4 3 3 2
第二个例子:class X
{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐
cout<<sizeof(x)<<endl; 结果 12 同上
第三个例子:char szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
三、sizeof深入理解。
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如: short f();
printf("%d\n", sizeof(f()));
输出的结果是sizeof(short),即2。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小, 当适用一静态地空间数组, sizeof 归还全部数组的尺 寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如: fun(char [8])
fun(char [])
都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int len)
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}
有关内容见: C++ PRIMER?
10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。当然这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的与实际不等。一般在VC++中加上#pragma pack(n)的设定即可.或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced compiler页中的Data alignment为按字节对齐。
11.sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式
四、结束语
sizeof使用场合。
1.sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: void *malloc(size_t size),
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
2.用它可以看看一类型的对象在内存中所占的单元字节。 void * memset(void * s,int c,sizeof(s))
3.在动态分配一对象时,可以让系统知道要分配多少内存。
4.便于一些类型的扩充,在windows中就有很多结构内型就有一个专用的字段是用来放该类型的字节大小。
5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。
6.如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小
分享到:
相关推荐
本文将深入探讨内存的堆分配和栈分配,以及字符数组、字符指针和`sizeof`运算符的相关知识。 1. **堆和栈分配** - **栈区**:栈由编译器自动分配和释放,用于存放函数参数值和局部变量。栈的操作遵循后进先出...
sizeof 详细总结 sizeof 操作符是 C 语言中一个非常重要的操作符,它可以计算一个对象或类型在内存中的实际长度。本文将对 sizeof 操作符进行详细的总结,包括其定义、语法形式、基本数据类型的 sizeof 值、指针...
总结来说,`sizeof`是C语言中一个强大的工具,用于获取数据类型和变量的内存占用。理解`sizeof`的使用和行为对于编写高效且跨平台的C代码至关重要。在编程时,应充分利用`sizeof`来检查和优化内存使用,避免潜在的...
下面是对`sizeof`的深入学习和实践总结。 首先,`sizeof`是一个编译时运算符,这意味着它在编译阶段计算值,而不是在运行时。因此,它可以用于确定任何类型或变量的大小,即使这个变量尚未被初始化。 1. 基本类型...
### 有关`strlen`和`sizeof`的归纳与总结 #### 一、`sizeof`的深入解析 **(一)`sizeof`的概念** `sizeof`是C语言中的一个单目操作符,它用来获取给定类型或表达式的字节大小。需要注意的是,`sizeof`不是一个...
### sizeof用法总结 #### sizeof的概念 `sizeof`是C/C++语言中的一个运算符,其功能主要是用来获取数据类型或者变量所占用的内存空间大小(以字节为单位)。在程序开发过程中,`sizeof`非常有用,尤其是在处理内存...
**总结**:`sizeof` 在 C 语言编程中是一个非常重要的操作符,理解它的使用方法、结果和应用场景对于编写高效可靠的代码至关重要。通过对 `sizeof` 的深入理解,开发者可以更好地控制程序的内存使用,优化程序性能。
总结,`sizeof`是一个强大的工具,能帮助程序员理解和优化程序内存使用。然而,它有其局限性,不能替代所有与大小相关的操作,比如动态数组或字符串的长度。在实际开发中,结合`sizeof`与其他工具,如`strlen()`,...
#### 五、总结 `sizeof` 是C++中非常有用的关键字,用于获取变量或类型的大小。正确理解和使用它可以避免很多潜在的问题。需要注意的是,`sizeof` 的行为在不同编译器和平台上可能会有所不同,因此编写代码时应该...
总结,`sizeof`是C和C++中非常有用的工具,它可以帮助开发者理解数据在内存中的布局,从而优化程序的性能和内存使用。理解和正确使用`sizeof`对于编写高效且内存友好的代码至关重要。在处理数组、结构体、联合体以及...
这个是一段关于sizeof的用法总结,现在拿过来和大家分享一下
总结来说,`sizeof案例`是一个很好的实践教程,帮助开发者掌握C语言中`sizeof`运算符的用法,加深对内存管理和类型大小的理解。通过分析`sizeof.c`源码并运行`a.out`,我们可以更直观地感知`sizeof`在实际编程中的...
总结,`sizeof`运算符在C语言中是理解和调试代码的重要工具,它可以提供关于变量、数组、结构体等占用内存的信息,帮助优化程序性能。在使用时需要注意其计算时机(编译时)和针对不同数据类型的特点。
总结 通过以上内容的详细介绍,我们可以看到`sizeof`虽然看起来简单,但实际上包含了相当多的细节和特殊情况。理解这些细节可以帮助我们更好地利用`sizeof`来优化代码性能,并避免潜在的错误。无论是初学者还是经验...
总结来说,不使用sizeof来判断数据类型所占内存大小的方法是基于指针运算和内存地址计算的技巧。在实际编程和面试中,了解这种方法及其适用场景对于程序员来说是一个加分项。然而,这种方法有一定的局限性,因此在...
C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒一下自己吧。 sizeof是什么 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–...
总结来说,`function sizeof` 是 PHP 中用于获取变量内存占用的实用工具,无论是在日常开发还是性能优化场景中,它都有着广泛的应用。理解并熟练运用 `sizeof` 函数可以帮助开发者更好地理解和管理程序的数据结构,...
在C++编程语言中,`sizeof`操作符是一个非常基础且重要的...总结来说,`sizeof`是C++中一个强大的工具,可以帮助程序员理解和控制程序的内存使用情况。正确理解和使用`sizeof`,对于编写高效、资源敏感的代码至关重要。
总结,`sizeof`在C语言中扮演着关键角色,它提供了关于内存布局和数据类型大小的重要信息,这对于编写高效、跨平台的代码至关重要。在编程时,充分利用`sizeof`可以提高代码的可移植性和内存管理效率。
总结起来,`sizeof` 用于获取类型或变量在内存中占用的字节数,而 `strlen` 用于计算以空字符结尾的字符串的实际长度。理解它们的差异和使用场景对于编写高效、无错的代码至关重要。在处理字符串和内存分配时,正确...