C/C++ :Sizeof 的用法

article/2025/8/27 16:49:03

Sizeof有以下特点:

  1. Sizeof是C/C++中的一个运算符,不是一个函数,返回值为size_t
  2. sizeof不能被编译成机器码,编译过程中就会计算sizeof的具体值,然后用值替换掉sizeof ()。所以可以用sizeof() 来定义数组的维数。
  3. sizeof ()里面的内容也不能被编译,而是被替换成类型。
  4. sizeof 后面可以直接加变量名,不用加();sizeof一个类型时,必须加()
  5. sizeof的参数可以有 内置类型(如char、int、double、bool、string、指针 等)、struct/class自定义结构体、带返回值的函数、数组。不能sizeof一个返回值是void的函数,编译会报warning,但程序还是能正常执行的。Sizeof一个带返回值的函数,结果等同于sizeof返回值的类型。Sizeof一个数组得到的是这个数组总的内存大小。
  6. sizeof与strlen的区别,后者是函数,且参数必须是char*,后者在程序运行过程中才能被计算出来。前者计算的是字符串所占内存空间,所以会加上字符串结束符’\0’所占的1个字节;后者计算的字符串长度,不加字符串结束符’\0’。

以下是一个sizeof知识相关的代码示例。其中,需要注意以下几点。

  1. sizeof (a = 6),a= 6是不被编译的,执行完之后a的值依然是9.
  2. Sizeof(str)得到的是数组的长度,sizeof(str_0)得到的是字符串所占内存的大小,包含’\0’所占的1个字节。
  3. sizeof (str_1)得到的是二维数组总的内存大小,strlen (str_1)则是错误的写法,因为strlen的参数只能是char*。
  4. Sizeof一个C++的string类型,是一个特殊的存在,有帖子中这样解释:string的实现在各库中可能有所不同,但是在同一库中相同一点是,无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。我使用gcc 5.0,得到的sizeof(string)结果是32.
  5. 一个空结构体(struct 或class),不包含任何成员变量,不包含虚函数,则sizeof这个结构体的结果等于1。
  6. 一个结构体(struct 或class)中包含虚函数,则sizeof的结果需要加上一个指针类型(虚函数表指针)的长度。
  7. sizeof (var[10])是正常的数组var的内存大小,但在fun_test_var(char var[])中,var[]退化成了char *,所以函数内sizeof(var)其实是sizeof(char *),结果为8byte。
//sizeof
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
class empty {
};
class empty_1 :public virtual empty {
};
class empty_2 {
public:  int f_int() {int a = 10;return a ;}double f_double() {double a = 10.0;return a ;}void f_void () {;}
}  ;class Base{public:virtual void f(int) {cout<<"base f(int)"<<endl;}virtual void f(double) {cout<<"base f(double)"<<endl;}
};int fun_test_var(char var[]){//warning: ‘sizeof’ on array function parameter ‘var’ //  will return size of ‘char*’ [-Wsizeof-array-argument]return sizeof(var);
}int main(int argc, char** argv){//https://www.cnblogs.com/wanghetao/archive/2012/04/04/2431760.htmlcout<<sizeof 2<<endl; // 2被解析成int类型的object, sizeof object的用法,合理cout<<sizeof(2)<<endl; // 2被解析成int类型的object, sizeof(object)的用法,合理cout<<sizeof(int)<<endl;// sizeof(typename)的用法,合理//cout<<sizeof int<<endl; // 错误!对于操作符,一定要加()int a = 9;cout <<" sizeof (a) "<<dec<<sizeof (a = 6)<<endl;cout <<" a = "<<a <<endl;char str[20] = "123456";cout <<" sizeof (str) "<<dec<<sizeof (str)<<endl;cout <<" strlen (str) "<<dec<< strlen (str)<<endl;char str_0 [] = "123456";cout <<" sizeof (str_0) "<<dec<<sizeof (str_0)<<endl;//have '\0' cout <<" strlen (str_0) "<<dec<< strlen (str_0)<<endl;//don't have '\0'  char str_1[2][20] = {"123456", "hello"};cout <<" sizeof (str_1) "<<dec<<sizeof (str_1)<<endl;cout <<" strlen (str_1) "<<dec<< strlen (str_1[0])<<endl;string str_2 [2] = {"0123456789 0123456789 0123456789 0123456789", "hello"};cout <<" sizeof (str_2) "<<dec<<sizeof (str_2)<<endl;cout <<" sizeof (string) "<<dec<<sizeof (string)<<endl;cout <<" sizeof (empty) "<<dec<<sizeof (empty)<<endl;cout <<" sizeof (empty_1) "<<dec<<sizeof (empty_1)<<endl;cout <<" sizeof (empty_2) "<<dec<<sizeof (empty_2)<<endl;empty_2 test_2;cout <<" sizeof (empty_2.f_int) "<<dec<<sizeof (test_2.f_int())<<endl;cout <<" sizeof (empty_2.f_double) "<<dec<<sizeof (test_2.f_double())<<endl;//warning: invalid application of ‘sizeof’ to a void type [-Wpointer-arith]cout <<" sizeof (empty_2.f_void) "<<dec<<sizeof (test_2.f_void())<<endl;cout <<" sizeof (Base) "<<dec<<sizeof (Base)<<endl;char var [10] ;cout <<" sizeof (var[10]) "<<dec<<sizeof (var)<<endl;cout <<" fun_test_var(var) "<<dec<<fun_test_var(var)<<endl;
}

参考:https://www.cnblogs.com/wanghetao/archive/2012/04/04/2431760.html

运行结果:


http://chatgpt.dhexx.cn/article/nTY7tDqi.shtml

相关文章

C语言中sizeof用法

sizeof()简单介绍 &#xff08;一&#xff09;基本概念 sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 &#xff08;二&#xff09;使用方法 1、用于数据类型 sizeof使用形式&#x…

【C语言】如何正确使用sizeof

sizeof用过吧&#xff1f;你肯定用过&#xff0c;至少你刚开始学C或者C的时候&#xff0c;学到类型这一节&#xff0c;你一定会写如下代码测试每个类型的长度。 printf("%d", sizeof(int));printf("%d", sizeof(char));printf("%d", sizeof(shor…

Sizeof的用法;他是一个函数吗?

1.一直以来以为sizeof是一个函数&#xff0c;看过c语言深度剖析才知道&#xff0c;sizeof是一个骗子&#xff0c;它伪装的很好~~~ 以下我们用实际代码来告诉你它其实是 关键字 #include<stdio.h> int main() { int i 0; printf("%d %d %d\n",sizeof(int)…

c语言—常见字符串函数与sizeof详解

1.sizeof使用 a.代码1 int main() {int a 0;int arr[] { 1,2,3,4 };printf("%d\n", sizeof(a));printf("%d\n", sizeof a);printf("%d\n", sizeof(&a));//表示地址的大小printf("%d\n", sizeof(int));printf("%d\n"…

sizeof函数的用法

sizeof函数的用法&#xff1a; 1、sizeof()函数是用来计算变量所占内存空间的大小&#xff0c;单位是字节&#xff08;byte&#xff09; 举例如下&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>//sizeof函数的用法 //sizeof()函数是用来计算变量所占…

C/C++ | sizeof()函数

C语言中 判断数据类型长度符的关键字 用法 sizeof (类型说明符) sizeof 表达式 定义 sizeof是C/C中的一个操作符&#xff08;operator&#xff09;&#xff0c;简单的说其作用就是返回一个对象或者类型所占的内存字节数。 MSDN上的解释为&#xff1a; The sizeof keyword…

开发人员必知!什么是Scrum敏捷开发?

什么是Scrum敏捷开发 Scrum是敏捷开发的一种,是一种以人为本,迭代式增量软件开发的过程,以英式橄榄球争球队形(Scrum)为名,因此可以想象,整个团队是高效而富有激情的。以人为本,即Scrum开发特别强调沟通,要求团队所有人员都坐着一起工作,通过高效的沟通解决问题。 S…

Scrum敏捷开发框架

Scrum 是一个用于开发和维持复杂产品的框架 &#xff0c;是一个增量的、迭代的开发过程。在这个框架中&#xff0c;整个开发过程由若干个短的迭代周期组成&#xff0c;一个短的迭代周期称为一个Sprint&#xff0c;每个Sprint的建议长度是2到4周(互联网产品研发可以使用1周的Spr…

Scrum敏捷开发实战分享(上篇):方法介绍、敏捷团队和敏捷流程

一、方法介绍 先从一则故事说起&#xff1a; 一天&#xff0c;一头猪和一只鸡在路上散步 鸡对猪说&#xff1a;“嘿&#xff0c;伙计&#xff0c;我们合伙开一家餐馆怎么样&#xff1f;” 猪看了一下鸡说&#xff1a;“好主意&#xff0c;那我们给它取什么名字呢&#xff…

什么是Scrum敏捷开发?

什么是敏捷开发&#xff1f; 敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。 怎么理解呢&#xff1f;首先&#xff0c;我们要理解它不是一门技术&#xff0c;它是一种开发方法&#xff0c;也就是一种软件开发的流程&#xff0c;它会指导我们用规定…

Scrum敏捷开发基础知识篇

Scrum 的定义 Scrum ( 名词): Scrum 是一个框架&#xff0c;在此框架中人们可以解决复杂的自适应难题&#xff0c;同 时也能高效并创造性地交付可能最高价值的产品。 Scrum 是: • 轻量的 • 易于理解的 • 难以精通的 Scrum 是一个框架&#xff0c;自上世纪 90 年代初以来&…

小团队SCRUM敏捷开发项目管理

概述 单团队敏捷开发主要是针对10人以下、只有一个Scrum团队的小型产品或项目的敏捷开发。 对于小型团队来说&#xff0c;在Leangoo中创建一个单团队敏捷开发项目就可以很好地支持团队产品或项目的开发。 适用场景 适用于单个团队进行Scrum敏捷开发协作&#xff0c;Leangoo项目…

实施Scrum敏捷开发的关键要素

一、敏捷开发由来 2001年2月11日至13日&#xff0c;美国犹他州瓦萨奇山雪鸟滑雪胜地&#xff0c;17个人聚到一起&#xff0c;试图找到软件开发的共识&#xff0c;最终的成果就是《敏捷软件开发宣言》。参会者们包括来自于极限编程、Scrum、DSDM、自适应软件开发、水晶系列、特征…

SCRUM敏捷开发教程

大家好&#xff0c;我是煎饼哥&#xff0c;本期向大家介绍一个关于敏捷开发的方法&#xff0c;叫做scrum&#xff0c;相信资深的产品经理都接触过类似的项目管理方法。 scrum敏捷开发&#xff0c;是一个美国统计学教授记录了多年工作经验&#xff0c;总结出来的一套简单易懂的开…

Scrum敏捷开发模式

前言 我的个人博客 最近报名参加了微信小程序应用开发赛&#xff0c;也是作为走向职场前的一次锻炼&#xff0c;为了模拟企业开发的流程&#xff0c;我们团队决定使用敏捷开发模式来管理项目。这篇文章&#xff0c;是对在近些天来网上学习到的Scrum敏捷开发模式的总结。 软件…

无向图的邻接表

如何根据无向图画出邻接表呢&#xff1f; 比如&#xff1a; 第一排的v1&#xff0c;与v2和v4相连&#xff0c;因此两个黄色方框内的数字分别代表v2和v4的下标&#xff1b; 第二排的v2&#xff0c;与v1、v3和v5相连&#xff0c;因此三个绿色方框内的数字分别代表v1和v3和v5的…

C++实现的邻接表

1. 在学习图的存储方式中&#xff0c;邻接矩阵和邻接表是两种比较常用的存储图的方式&#xff0c;下面使用的是C语言实现的邻接表 2. 具体的实现过程如下&#xff1a; ① 首先使用结构体声明图的结构体&#xff0c;图中顶点的结构体&#xff0c;以及指向下一条边的结构体&…

图的存储--邻接表

邻接表既适用于存储无向图&#xff0c;也适用于存储有向图。邻接表常用于稀疏图的存储。 邻接表存储图主要在于将图的各顶点建立一个链表&#xff0c;链表记录该顶点的邻接点的在数组的位置。 #define MAX_VERTEX_NUM 10 // 最大顶点数 #define INF 32767 // 不邻接 typedef…

有向图的邻接矩阵、邻接表和逆邻接表

1、如何根据有向图画出邻接矩阵&#xff1f; 如图&#xff1a; v1指向v2和v3&#xff0c;在矩阵中v1指向v2、v3的表示标1。 注意&#xff1a; v1指向v2在矩阵中是用竖列的v1对应横行的v2 2、如何根据有向图画出邻接表呢&#xff1f; 注意&#xff1a; 画有向图的邻接表时…

【数据结构】 图的邻接表

邻接表是图的另一种存储结构&#xff08;使用链表的思想&#xff09;。 该方式的基本思路&#xff1a;顶点表后指向邻接表&#xff0c;邻接表中依次为当前顶点的邻接点 准备工作 与邻接矩阵类似&#xff0c;在构造邻接表之前&#xff0c;需要存储各个顶点的信息&#xff0c;…