首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么C的sizeof的返回值类型会随着上下文的变化而变化?

C语言中的sizeof操作符用于获取一个变量或数据类型的字节大小。它的返回值类型是size_t,这是一个无符号整数类型。sizeof操作符在编译时求值,因此它的返回值在编译时就确定了。

sizeof操作符的返回值类型不会随着上下文的变化而变化。无论在什么上下文中使用sizeof操作符,它的返回值类型始终是size_t。

然而,sizeof操作符的结果可能会受到上下文的影响。具体来说,sizeof操作符可以用于计算数组的大小、结构体的大小以及动态分配内存的大小。在这些情况下,sizeof操作符的结果可能会根据上下文中的类型而变化。

例如,当sizeof操作符应用于数组时,它返回整个数组的字节大小。但是,当sizeof操作符应用于指向数组的指针时,它返回指针的字节大小,而不是整个数组的大小。这是因为指针只存储数组的地址,而不存储整个数组的内容。

总之,sizeof操作符的返回值类型始终是size_t,但它的结果可能会根据上下文中的类型而变化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么果蝇求爱“姿势”变化?普林斯顿新研究:通过看,揪出背后神经元 | Nature子刊

正如哈佛医学院神经生物学家 Bob Datta 所说: 我们不了解大脑输出,要弄清楚这些高密度神经编码,就需要对行为有更深入了解。...看行为动作,预测大脑状态 捕捉果蝇行为变化神经网络,是广义线性模型(GLM)+ 隐马尔可夫模型(HMM)。 这是一种无监督方法。...也就是说,这一概率随着雄蝇收到反馈变化变化,并且,研究人员能够确定在每个时间点,是哪些反馈线索影响了最终转换概率。...但在当时,研究人员需要捕捉老鼠所有动作,因为他们不知道所观察到哪些动作是比较重要。 接着,有些科学家就开始采取相反策略做研究。...在接下来几十年里,人们开发了一种系统,可以在视频每一帧中标记动物位置,用来区分多种生物体,甚至可以开始识别身体某些部位和方向。 尽管如此,这些项目并没有达到科学家们所需要效率。

64220

Redis 事件驱动分析

很多公司面试时候都喜欢问为什么 Redis 那么快?这就得益于 Redis 事件驱动模块 ,什么是 事件驱动 呢?通俗来说,事件驱动 指的是当某一事件发生触发某一处理过程。...不同操作系统有不同多路复用IO接口,比如 Linux 系统中使用是 epoll, FreeBSD 系统中使用 kqueue。...aeApiDelEvent() // 用于把客户端连接从事件驱动上下文中删除 aeApiPoll() // 用于等待监听客户端连接状态发生变化 aeApiName()...// 用于获取正在使用事件驱动类型(如epoll、kqueue、select等) 然后在 ae.c 文件中可以发现以下代码: #ifdef HAVE_EVPORT #include "ae_evport.c...aeApiPoll() 函数主要通过调用 epoll_wait() 系统调用来等待被监听客户端连接状态发生变化,epoll_wait() 系统调用会将就绪客户端连接保存到 events 参数中,并且通过返回值告知其数量

1.3K20

c++11面试宝典(final,delete,deault,explicit,lambda表达式)

无法将 A b = 1; 变为: A b = A(1); 从而导致编译失败 5. lambda表达式 5.1为什么要用lambda表达式 在C++98中,如果想要对一个数据集合中元素进行排序...(gds) / sizeof(gds[0]), Compare()); return 0; } 随着C++语法发展,人们开始觉得上面的写法太复杂了,每次为了实现一个algorithm算法, 都要重新去...->returntype:返回值类型。用追踪返回类型形式声明函数返回值类型,没有返回值时此部分 可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。 {statement}:函数体。...在该函数体内,除了可以使用其参数外,还可以使用所有捕获到变量。 注意: 在lambda函数定义中,参数列表和返回值类型都是可选部分,捕捉列表和函数体可以为空。...int a = 3, b = 4; [=]{ return a + 3; }; // 省略了返回值类型,无返回值类型 auto fun1 = [&](int c

54220

表达式求值过程中会发生哪些隐藏变化?求值顺序又由什么决定?——详解C表达式求值中隐式类型转换,算术转换问题,以及操作符属性

我们写出表达式,在求值过程中,一定是按照我们所想在一步一步运算吗?会不会发生一些我们察觉不到变化呢?任意给定一个表达式,它计算路径一定是确定吗?...整形提升是按照变量数据类型符号位来提升: (1)负数整形提升(高位补符号位1) char c1 = -1; 变量c1二进制位(补码)中只有8个比特位: 1111111 因为 char...实例三: int main() { char c = 1; printf("%u\n", sizeof(c)); printf("%u\n", sizeof(+c)); printf("%u\n...", sizeof(-c)); return 0; } 我们分析结果应该是 1,4,4; c只要参与表达式运算,就会发生整形提升,表达式 +c ,发生整型提升,所以 sizeof(+c) 是4个字节...同理 sizeof(-c) 也是4个字节, 但是 sizeof( c ) ,就是1个字节,因为没有发生整型提升,还是char类型

6510

c++代码整洁之道

面向对象开发原则 依赖倒置原则:针对接口编程,依赖于抽象不依赖于具体,抽象(稳定)不应依赖于实现细节(变化),实现细节应该依赖于抽象,因为稳定态如果依赖于变化态则会变成不稳定态。...不需要原则(YAGNI, You're not gonna need it):总是在你真正需要时候再实现他们,不是在你只是预见到你将来需要他们而去实现,在真正需要时候再写代码,那时再重构也来得及...类型,如果需要使用大整型可以考虑int64,否则类型隐式类型转换带来很多麻烦 如无特殊必要不要使用宏,可以考虑使用const或constexpr替代宏,宏全局作用域很麻烦,如果非要用在马上要使用时才进行...) 代替 sizeof(type).使用 sizeof(varname) 是因为当代码中变量类型改变时会自动更新....C++主流技术 可以考虑更多使用异常处理方式,不是C语言风格errno错误码等,这里可以参考你c++团队还在禁用异常处理吗?

1K10

开启C++之旅(下):引用、内联函数及现代特性(auto和范围for循环)

这也是为什么对a进行类型转换后赋值,但是a不发生变化 1.4引用使用场景 1.4.1做参数 在函数中使用引用作为参数,可以让你直接操作传递给函数变量,不是对其进行复制。...然而,使用引用作为返回值需要小心,确保引用所指向变量在函数返回后仍然有效 使用引用作为返回值语法是在函数声明或定义中将函数返回类型声明为引用类型。...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,指针可以在任何时候指向任何一个同类型实体 没有NULL引用,但有NULL指针 在sizeof中含义不同:引用结果为引用类型大小...现在在其他源文件里使用内联函数时不行 3. auto关键字 随着程序越来越复杂,程序中用到类型也越来越复杂,经常体现在: 类型过长难于拼写 含义不明确导致容易出错 auto就是来解决这个问题 3.1...概念 C++11中,标准委员赋予了auto全新含义即:auto不再是一个存储类型指示符,而是作为一个新类型指示符来指示编译器,auto声明变量必须由编译器在编译时期推导得 int main

15310

C语言】动态内存管理

3 4、笔试题4 五、C/C++程序内存开辟 六、柔性数组 1、什么是柔性数组 2、柔性数组成员定义 3、柔性数组使用 4、柔性数组优势 一、为什么存在动态内存分配 C语言学习到现在,我们已经掌握和了解到内存开辟方式是通过数据类型来定义变量...; malloc 返回值类型是 void* ,因为 malloc 函数并不知道需要开辟空间类型,所以我们在具体使用时候需要进行一下强转; 如果给 malloc 第二个参数 size...,但是你使用完之后不归还,这样别人也用不了这块空间了,虽然这块空间还存在,但是相当于没有了),这是我们就会发现,随着程序持续运行,可供我们使用内存变得越来越少; 内存泄露是我们进行动态内存管理是最容易犯错误...这些函数向内存申请空间是有可能失败,申请失败函数就会返回空指针,如果我们不对函数返回值进行判断,直接对其解引用的话,就会造成程序崩溃;例如: void test() { int* p = (int...5、对同一块动态内存多次释放 我们在写程序时候可能在程序中某一位置已经对动态内存进行释放了,但是随着后面代码展开,我们可能忘记了重复对一块动态内存进行释放。

1.6K00

C语言深度解剖 (四)

,但是下面的数值变化让人迷惑不解,因为p指针随内容变化(这个是不应该发生事情,这是VC++6.0bug) #include void main() { int *...数组大小 void main() { int a[5]={1,2,3,4,5}; int i=sizeof(&a); //20 这是一个地址,但为什么是20个字节长度呢 int j=sizeof...(a); //20 a作为一个首地址,为什么是20个字节长度呢 int k=sizeof(&a[0]); //4 int l=sizeof(&a[5]); //4 及便这个元素不存在 } 可以将它们地址分别取出来看看...一个类型为T指针移动,是以sizeof(T)为移动单位 &a 与 a 值是一样,但是意思不一样 &a 是数组(结构体/构造体)首地址 a 是数组首元素首地址 &a+1,取数组a首地址,...(int) ,地址相减获得是此类型数据占用内存单位数,所以,虽然相差16个字节,但是相差4个单位,一个int占4字节 原文地址

31940

记一次在Mac系统下因为栈上变量溢出导致内存泄露问题

我们先加两句打印语句,看看是否值真的变化了:图片图片运行结果:图片test_plain指针果然变化了!!!...通过仔细对比SM2Encrypt接口定义与实际传参类型,可以发现,在传入cipher_len这个参数时,类型上有点点区别:图片传入参数cipher_len定义是int型,接口定义类型是size_t...*,通过打印这两种类型,可以发现,在mac上,int与size_t所占用字节数是不同: printf("sizeof(int)=%lu, sizeof(size_t)=%lu, sizeof(...*));sizeof(int)=4, sizeof(size_t)=8, sizeof(int*)=8, sizeof(size_t*)=8int型变量占用字节是4个字节,size_t型变量占用字节是...至于为什么Linux下指针值只有低位地址,Mac下却有高位地址呢?这个应该与OS内存管理设计有关,也与OS是否开启地址随机化有关系,这块后面有时间再慢慢研究吧!

1.7K3421

写了这么多代码,你了解自己代码内存消耗么?

C/C++这种内存堆空间申请和释放完全靠自己管理 Java 依赖JVM来做内存管理,不了解jvm内存管理机制,很可能因一些错误代码写法导致内存泄漏或内存溢出 Python内存管理是由私有堆空间管理...如果我们写C++程序,就要知道栈和堆概念,程序运行时所需内存空间分为 固定部分,和可变部分,如下: 固定部分内存消耗 是不会随着代码运行产生变化, 可变部分则是产生变化 更具体一些,一个由...在可变部分中,栈区间数据在代码块执行结束之后,系统自动回收,堆区间数据是需要程序员自己回收,所以也就是造成内存泄漏发源地。...如何计算程序占用多大内存 想要算出自己程序会占用多少内存就一定要了解自己定义数据类型大小,如下: 注意图中有两个不一样地方,为什么64位指针就占用了8个字节,32位指针占用4个字节呢?...不要以为只有C/C++才会有内存对齐,只要可以跨平台编程语言都需要做内存对齐,Java、Python都是一样。 而且这是面试中面试官非常喜欢问到问题,就是:为什么会有内存对齐?

48320

面试总结-C++

加上extern “C”后,会指示编译器这部分代码按C语言进行编译,不是C++。...用sizeof来返回类型以及静态分配对象、结构或数组所占空间,返回值跟对象、结构、数组所存储内容没有关系;strlen是字符处理库函数,当数组名作为参数传入时,实际上数组就退化成指针了。。...- int *p(int)是函数声明,函数名是p,参数是int类型返回值是int *类型。...因为静态成员属于整个类,不属于某个对象,如果在类内初始化,导致每个对象都包含该静态成员,这是矛盾。...(1)操作符new返回指针类型严格与对象匹配,不是void; (2)C中很多以void为参数函数可以改写为C++模板函数,模板是支持类型检查; (3)引入const关键字代替#define constants

2.1K11

C++干货基地】C++引用与指针区别:深入理解两者特性及选择正确应用场景

引用和指针作用其实是差不多,对变量引用修改影响变量,指针也是对指针修改影响指针所指向内容: 但是引用在使用上和一些场景比指针更简便更容易理解 代码演示: #define _CRT_SECURE_NO_WARNINGS...= b; c = 30; cout << a << endl; return 0; } 代码结果: 三、常引用 这里为什么会有常引用概念呢?...这是因为 当我们进行赋值,或者进行隐式类型转换时候,这里产生一个临时变量,临时变量具有常性 是不可进行,改变和隐式类型转换 这是我们对其 临时变量常性,进行权限平移就会进行报错了 int main...() { int a = 10; double b = a; const int& x = b; return 0; } 那么为什么产生临时变量?...,或者动态开辟空间不会随着函数销毁销毁空间才可以用引用做返回值 如果不是动态开辟空间或者再堆上开辟空间,随着函数销毁销毁就一定要用传值传参 这里在顺序表里面如果把 Get 获取函数指定位置值进行传引用返回的话就可以把修改循序表

9200

DAX进阶-死磕Calculate之1:改变筛选上下文之忽略(”删“)

小勤:在文章《DAX入门:无动态,不智能——谈谈DAX函数计算环境(筛选上下文)问题》里提到,默认情况下度量计算是随着计算环境(筛选上下文选择动态变化,但有时候就是需要一些不变情况,那怎么办...我们先来看“删”,比如我们现在有一个度量是这样: 我们在数据透视表里,这个量随着行列维度(筛选上下文变化,结果如下: 如果我们要把这些筛选上下文去掉,即销售量不随相应行列维度...(筛选上下文变化,那么,我们就需要把这些影响计算上下文给去掉(可以理解为“删”),这时就可以用Calculate函数加All函数来完成,度量如下: 我们把这个度量也放到透视表里看看...大海:那我们就在All函数里写清楚要忽略具体字段,比如我们写一个度量,只忽略销售人员: 放到数据透视表里看看: 小勤:为什么其中只有B和C产品忽略了销售人员呢?...比如A产品为什么不都是100呢? 大海:不是只有B和C产品忽略了,维度A产品和销售人员小勤组合为空,是这种维度组合不存在。 小勤:原来这样。那如果需要忽略多个字段呢?

77920

C++11:可变参数模板lambda表达式

这种就地展开参数包方式实现关键是逗号表达式。我们知道逗号表达式按顺序执行逗号前面的表达式。...随着C++语法发展,人们开始觉得这种写法太复杂了,每次为了实现一个algorithm算法,都要重新去写一个类,如果每次比较逻辑不一样,还要去实现多个类,特别是相同类命名,这些都给编程者带来了极大不便...->returntype:返回值类型。用追踪返回类型形式声明函数返回值类型,没有返回值时此部分可省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。...在该函数体内,除了可以使用其参数外,还可以使用所有捕获到变量。 注意: 在lambda函数定义中,参数列表和返回值类型都是可选部分,捕捉列表和函数体可以为空。...b = 4; [=] {return a + 3; }; // 省略了返回值类型,无返回值类型 auto fun1 = [&](int c) {b = a + c; }; fun1(10)

1K40

【熟视C语言】C语言动态内存管理(malloc,calloc,realloc,free)

为什么需要使用动态内存 对于初学者来说,最先接触到内存使用便是以下场景: // int val = 3;//为变量val在栈区上申请一块空间存储数据 char str[] = "abc";//为数组str...而在我们实际生活中又确实会出现一组数据量随时变化数据组。这时我们就需要使用动态内存函数来为数组,变量来开辟空间。...返回值类型是void*指针,具体使用时只需要对返回指针进行强制类型转换即可。 在标准中malloc并未对size是0情况进行规定,具体情况看编译器。...返回值为一个指向调整之后空间起始地址void*指针。 如果申请失败返回一个空指针,并且不会自行释放原先空间。...*)realloc(array, 12);//由于申请失败时不会自行释放原空间,此代码将原先指向原空间指针置空,无法再找回原空间并释放(内存泄露) //安全操作 int*

13910

SwiftUI 与 Core Data —— 安全地响应数据

本文将介绍可能在视图中产生严重错误原因,如何避免,以及在保证视图对数据变化实时响应前提下如何为使用者提供更好、更准确信息。由于本文涉及大量前文中介绍技巧和方法,因此最好一并阅读。...Core Data 受限于 Objective-C 中可表达类型限制,在即使使用了标量转换情况下( Scalar )也不具备与 Swift 原生类型对应能力。...此时如果再访问该实例可选值类型属性( 例如之前一定有值 timestamp ),返回值则为 nil 。强制解包将导致应用崩溃。...在上节演示中,当数据被删除后( 通过 onAppear 闭包中延迟操作 ),NavigationView 自动返回到根视图中。在这种情况下,持有该数据视图将伴随着数据删除一并消失。...任何可能脱离视图传递过程都应使用托管对象实例对应类型版本。在更改数据时进行二次确认为了避免对主线程造成过多影响,我们通常会在私有上下文中进行会对数据产生变化操作。

3.2K20

C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解

4个动态内存开辟函数:malloc,free,calloc和realloc,这些C标准库中内存管理函数都声明在在 stdlib.h 头⽂件中。干货满满!学习起来吧! 为什么要有动态内存分配?...malloc分配40个字节空间,p存放是分配空间首地址,malloc只知道申请多大空间,但是不知道放什么类型数据,所以malloc函数就只能返回void*,当使用void*时,也就是void*...返回值类型是 void* ,所以malloc函数并不知道开辟空间类型,具体在使⽤时候使⽤者⾃⼰来决定。 如果参数 size 为0,malloc⾏为是标准是未定义,取决于编译器。...小知识:为什么free没有能力将ptr置为空指针? C语言采用传值调用,形参是实参一份临时拷贝,函数内只能操作形参,无法直接修改实参。free形参是ptr,它无法直接修改调用函数内ptr变量。...0,malloc不会初始化内存。

9510

指针

动态创建一维数组语法:数据类型 * 指针 = new 数据类型[数组长度]; 释放一维数组语法: delete[] 指针; 注意: 动态创建数组没有数组名,不能用sizeof运算符。...因为数组自动跟踪已分配数组内存。 1.11 二维数组用于函数参数 1) 行指针(数组指针) 声明行指针语法:数据类型 (*行指针名)[行大小]; //行大小即数组长度。...同样,声明函数指针时,也必须提供函数类型,函数类型是指返回值和参数列表(函数名和形参名不是) 假设函数原型是: int func1(int no,string str); int func2(int...函数指针主要是用于回调函数,即我们定义一个函数,这个函数去调用另一个函数,在调用另一个函数之前我们有通用逻辑,调用之后有通用逻辑,但是这个被调用这个函数可以是个性化返回值和参数类型要相同),针对这个个性化函数...,可以是不同函数名函数,同时内部逻辑完全是不一样,只要参数类型和函数返回值相同即可。

14200

刷了这么多题,你了解自己代码内存消耗么?

C/C++这种内存堆空间申请和释放完全靠自己管理 Java 依赖JVM来做内存管理,不了解jvm内存管理机制,很可能因一些错误代码写法导致内存泄漏或内存溢出 Python内存管理是由私有堆空间管理...固定部分内存消耗 是不会随着代码运行产生变化, 可变部分则是产生变化 更具体一些,一个由C/C++编译程序占用内存分为以下几个部分: 栈区(Stack) :由编译器自动分配释放,存放函数参数值...在可变部分中,栈区间数据在代码块执行结束之后,系统自动回收,堆区间数据是需要程序员自己回收,所以也就是造成内存泄漏发源地。...注意图中有两个不一样地方,为什么64位指针就占用了8个字节,32位指针占用4个字节呢?...不要以为只有C/C++才会有内存对齐,只要可以跨平台编程语言都需要做内存对齐,Java、Python都是一样。 而且这是面试中面试官非常喜欢问到问题,就是:为什么会有内存对齐?

43320
领券