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

为什么sizeof("")等于1而sizeof(NULL)相当于c语言中的4?

sizeof("")等于1是因为C语言中的字符串常量是以空字符'\0'结尾的字符数组,而""表示一个空字符串,即只有一个空字符'\0'。因此,sizeof("")返回的是字符串常量的长度,即1。

而sizeof(NULL)相当于C语言中的4是因为NULL在C语言中被定义为一个空指针常量,通常被表示为0。在32位系统中,指针的大小为4个字节,因此sizeof(NULL)返回的是指针的大小,即4。

需要注意的是,sizeof("")和sizeof(NULL)返回的结果并不是字符串或指针本身的长度,而是它们所占用的内存空间的大小。

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

相关·内容

C语言基础】:深入理解指针(二)

指针 ± 整数 在C言中,我们知道数组在内存中是连续存放,所以我们只要知道了数组第一个元素地址,就可以顺藤摸瓜找到后面元素地址。...如何避免野指针 指针初始化 如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里,可以给指针赋值NULLNULLC言中定义一个标识符常量,值是0,0也是地址,这个地址是无法使用...= NULL) 上面代码在程序运行到这一行语句时,验证变量 p 是否等于 NULL 。如果确实不等于 NULL ,程序 继续运行,否则就会终止运行,并且给出报错信息提示。...五、指针与数组 5.1 数组名理解 在C言中,数组名是数组首元素地址,但是经过实验会发现有两个例外 一个就是sizeof(数组名),sizeof中单独放数组名,这里数组名表示整个数组,计算是整个数组大小...数组名加一在地址上显示增加了四个字节,&数组名加一后却增加了四十个字节,这是为什么呢?

9810

C语言(2)----数据类型、变量以及操作符

1.数据类型介绍 数据类型是c言中用来描述生活中各种数据一种分类,例如年龄,体重等等。...1byte=8bit,而在计算机语言中1bit就相当于一个进制位,即1or0.所以1byte相当于8个进制位。 再返回到sizeofsizeof 操作符操作数可以是类型,也可是变量或者表达式。...sizeof 运算符返回值,C ⾔只规定是⽆符号整数,并没有规定具体类型,⽽是留给系统⾃⼰去决定, sizeof 到底返回什么类型。...这样不利于程序可移植性。 C ⾔提供了⼀个解决⽅法,创造了⼀个类型别名 size_t ,⽤来统⼀表⽰ sizeof 返 回值类型。...(1) 局部变量是放在内存栈区 (2)全局变量是放在内存静态区 (3) 堆区是⽤来动态内存管理 6.算术操作符 在c言中也会有加减乘除这样算术方式,而且它与正常加减乘除差别有,却不是很大。

10010

一文带你了解c++和c中字符串使用

一、c++中字符串表示形式: 有可能有些网友还没怎么接触到c++(c++它是一门面向对象语言,c是一门面向过程语言,所以这里可能没接触过那个面向对象网友不习惯这个用法,不过还是建议至少要掌握一门面向对象语言...(0等于'\0','0'等于48) 2、c++中字符串表示:       在c++中我们要定义一个字符串的话,我们使用string来定义: string str="linux"; 二、c语言里面的字符串如何来使用呢...下面就用实际代码来讲解它具体表示: 1、字符数组初始化与sizeof、strlen:      (1)sizeofC语言一个关键字,也是C语言一个运算符(sizeof使用时是sizeof(类型或变量名...为什么需要sizeof?...字符数组本身是数组,数组自身自带内存空间,可以用来存东西(所以数组类似于容器);字符串本身是指针,本身永远只占4字节,而且这4个字节还不能用来存有效数据,所以只能把有效数据存到别的地方,然后把地址存在

70720

C语言编程—内存管理

C言中动态内存管理。C语言为内存分配和管理提供了几个函数。这些函数可以在 头文件中找到。 在C言中,内存是通过指针变量来管理。...*/ description = (char *) realloc( description, 100 * sizeof(char) ); if( description == NULL...C言中常用内存管理函数和运算符 malloc() 函数:用于动态分配内存。它接受一个参数,即需要分配内存大小(以字节为单位),并返回一个指向分配内存指针。...为什么多用malloc很少用calloc?...因为calloc虽然对内存进行了初始化(全部初始化为0), calloc相当于 p = malloc(); memset(p, 0,size); 相对于malloc多了对内存写零操作,写零这个操作我们有时候需要

22430

C++:05---class和struct

3、关于大括号初始化问题 struct在C言中: 在C言中,我们知道struct中是一种数据类型,只能定义数据成员,不能定义函数,这是因为C语言是面向过程,面向过程认为数据和操作是分开,所以C言中...如果 Class A; A obj; 那么sizeof(A)==sizeof(obj) 那么sizeof(A)大小和成员大小总和是什么关系呢,很简单,一个对象大小大于等于所有非静态成员大小总和。...为什么是大于等于不是正好相等呢?...如果在类中声明了虚函数(不管是1个还是多个),那么在实例化对象时,编译器会自动在对象里安插一个指针指向虚函数表VTable,在32位机器上,一个对象会增加4个字节来存储此指针,它是实现面向对象中多态关键...(a)<<endl;//result=1 cout<<sizeof(b)<<endl;//result=1 //对象c扩充为2个字,但是对象b为什么没扩充为1个字呢(空类对象一个字节,含一个

72930

c言中malloc作用,malloc函数-malloc函数,详解

printf(“%d%d%d\n”, sizeof(p[0]),sizeof(p[1]),sizeof(p[2])); //为p数组分配三个元素输出为4 4 4,那不是有12个字节了吗?...malloc分配空间,是指系统按照你程序在内存堆栈中分配一段内存给你,该内存段首地址赋值给你p,这是基本指针概念,为什么要强调这个?...C言中malloc函数使用方法 如题,知道告诉下,谢谢。...C言中,malloc函数动态分配内存后,函数结束后不会释放,程序结束后会由系统释放,相当于在堆区人为开辟了静态区域(占用是堆区空间),如果有重复分配(循环),会不断占用内存,直到程序结束。...malloc函数返回值 int *d = (int *)malloc(10 * sizeof(int)); int **d = malloc(rows * sizeof(int *)); 1、这里为什么第一条语句就用

2.1K30

C:03---运算符优先级

C语言随机数函数 int a=rand()%10; //产生0~9之间随机数,就是上面的原理 三、*运算符注意事项 在C言中,要尽量少用*,特别是在硬件开发中 因为对于*来说,CPU可能要运行多个周期...+、-等运算符,CPU只需要一个周期 四、++,-- 自增自减运算符 这里区别于指针++和--, --(++)变量 表示变量先-1(+1),再返回表达式值。...: test 1 a:2 b:2 test 2 a:2 b:2 a:2 b:1 六、sizeof 运算符 有人听到sizeof是运算符可能会大吃一惊,实际上在我开始学习C时候,误认为sizeof...", sizeof NULL); return 0; } 你算下结果是不是和你想一样,如果不一样,为什么呢,如果有不明白可以在留言板或者聊天频道给我留言哈。...“2n次方” 演示案例: #include int main() { int a = 8; // 相当于8*(22次方) = 8*4 =32 printf("%d\n",

53510

一篇文章完全讲解C语言指针

而且在C言中,并不是所有的内存数据都有名称,例如使用malloc申请堆内存就没有。 4、内存数据地址 如果一个类型占用字节数大于1,则其变量地址就是地址值最小那个字节地址。...在C言中,我们让指针变量赋值为NULL表示一个空指针,C言中NULL实质是((void*)0),就像前面说指针可以理解成特殊int,它总是有值,p=NULL,其实就是p等于0。...C言中,实参传递给形参,是按值传递,也就是说,函数中形参是实参拷贝份,形参和实参只是在值上面一样,不是同一个内存数据对象。...另外我们为什么要使用指针不是直接传递Student变量呢?...指针常用在C言中引用,则用于诸如Java,C#等 在语言层面封装了对指针直接操作编程语言中

87020

C++学习笔记---------基础知识sizeof用法

<<sizeof(a=3)<<endl; cout<<a<<endl;    输出为什么4,0不是期望中4,3???...=操作符返回左操作数类型,所以a=3相当于int,代码也被替换为: int a = 0; cout<<4<<endl; cout<<a<<endl;    所以,sizeof是不可能支持链式表达式...c言中判断数据类型长度符 用法       sizeof(类型说明符,数组名或表达式); 或       sizeof 变量名 1....数组sizeof 数组sizeof等于数组所占用内存字节数,如: char a1[] = "abc"; int a2[3]; sizeof( a1 ); // 结果为4,字符 末尾还存在一个NULL...Why为什么受伤总是我 请不要沮丧,我们来好好琢磨一下sizeof定义——sizeof结果等于对象或者类型所占内存字节数,好吧,那就让我们来看看S1内存分配情况: S1 s1 = { 'a',

55010

c语言基础学习04_条件判断语句

例如:   #define MAX 100 说明定义MAX是一个有符号int   const long a = 100u; 说明定义a是一个无符号long   "a"字符串常量 相当于...'a' '\0'   'a'字符常量,字符常量只能是一个ASCII字符   int 4个BYTE、2个WORD 、1个DWORD   c言中不能直接书写二进制,用8进制和16进制来替代(和默认十进制...int a = 100;   int b = sizeof(a); sizeof 关键字 作用是:得到某一数据类型在内存中占用大小(内存大小没有负),单位是:字节   sizeof 不是函数,...======== 条件分支语句: 1、关系运算符:在c言中0代表false,非0代表真。...关系运算符有:(大于)、=(大于等于)、==(等于)、!

1.3K10

逆向知识十三讲,汇编中数组表现形式,以及还原数组

Ary + sizeof(type) * n Ary+ (n*sizeof(type)) 在这里可能大家会有疑问,为什么esp + var_c是数组首地址,不用+18h?...)了,可以提出来 代入公式得到:   ary + 4 * 1 * 3 + 0 =  ary + 12 也就是说数组首地址 + 12 就得出4所在地址位置. +12在高级语言中,因为要%4对齐,所以我们要...通过我们数组寻址公式得出   1.edx 是获取i值   2. edx * C  相当于我们数组中寻址公式 sizeof(type[C]) *i 值.   3.lea时候 求出数组首地址 +...sizeof(type[c])值.   4.ecx得出j值   5.eax + 4 * ecx  相当于数组首地址 + sizeof(type)*j 致此熟悉数组寻址公式看汇编代码很简单了..... eax * 30 ,相当于sizeof(type[C][H]) * i   3.求出数组首地址+eax,也就是求出了 Ary[M]位置,给Ecx赋值   4.求出j值   5.左移4位,相当于

1.2K70

C语言】深入解开指针(二)

printf("%d ", *pa); pa++; } return 0; } 三、野指针 在 C言中,野指针是指未被初始化指针。...指针指向空间释放 在C言中,当一个指针指向一个函数中分配内存空间时,如果在该函数返回之前释放了该内存空间,那么这个指针就成为了一个野指针。...NULLC⾔中定义⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤,读写该地址 会报错。...= NULL); p 是否等于 NULL 。如果确实不等于 NULL ,程序继续运⾏,否则就会终⽌运⾏,并且给出报错信息提⽰。 assert()宏接受一个表达式作为参数。...b值,不过x地址和a地址不⼀样,y地址和b地址不⼀样,相当于x和y是独⽴空间,那么在Swap1函数内部交换x和y值,⾃然不会影响a和b,当Swap1函数调⽤结束后回到main函数,a和b没法交换

10910

完全合并C++面试题

————————————————————————– 6.以下是C言中两种if语句推断方式。请问哪种写法更好?为什么?...从名称上也能够看出,c++比c多了+,说明c++是c超集;那为什么不叫c+c++呢,是由于c++比 c来说扩充东西太多了,所以就在c后面放上两个+。...于是就成了c++ C语言是结构化编程语言,C++是面向对象编程语言。 C++側重于对象不是过程,側重于类设计不是逻辑设计。...size最大为unionsize 解析C言中sizeof 一、sizeof概念    sizeofC语言一种单目操作符,如C语言其它操作符++、–等。...return 1; } sizeof(func(“1234”))=4//由于func返回类型为int。所以相当于 //求sizeof(int).

35320

sizeof 操作符详解

数组sizeof 数组sizeof等于数组所占用内存字节数,如: char a1[] = "abc"; int a2[3]; sizeof( a1 ); // 结果为4,字符 末尾还存在一个...NULL终止符 sizeof( a2 ); // 结果为3*4=12(依赖于int) 一些朋友刚开始时把sizeof当作了求数组元素个数,现在,你应该知道这是不对。...相当于char* a3,为什么仔细想想就不难明白。 我们调用函数foo1时,程序会在栈上分配一个大小为3数组吗?不会!...为什么受伤总是我? 请不要沮丧,我们来好好琢磨一下sizeof定义 —— sizeof结果等于对象或者类型所占内存字节数。...这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4c1与s之间便需要3个填充字节,c2与s之间就不需要了,所以c2偏移量为12,算上c2大小为13,13是不能被4整除

74530

C语言进阶——动态内存管理

---- 正文   C言中动态内存开辟函数有三个:malloc、calloc 和 realloc,有开辟就要有释放,一般在使用以上三个函数时,都会配套使用一个 free 来进行内存释放。...),即使有重复数字,也都只会改一次,如果是没有出现数字,就默认为0(根据值来判断,如果出现过,不管是否重复,都为1)。...至于为什么不直接在堆上申请,使用完后释放?...0; } 注意 注意 1.柔性数组前至少要有一个其他成员 2.sizeof 计算结构体大小时,并不会包含柔性数组大小 3.在对柔性数组进行空间分配时,一定要包含结构体本来大小 4.柔性数组是...优势 1.不易于产生内存碎片,有益于提高访问速度 2.方便内存释放(只需要释放一次) 总结   以上就是关于C言中动态内存管理全部内容了,我们从 malloc 开始,到柔性数组结束,学习了多种动态内存开辟方式

44710

C语言之精华——指针详解(下)

当把数组名赋值给一个指针后,再对指针使用sizeof运算符,返回是指针大小。 这就是为什么我么将一个数组传递给一个函数时,需要另外用一个参数传递数组元素个数原因了。...「函数参数和指针」 C言中,实参传递给形参,是按值传递,也就是说,函数中形参是实参拷贝份,形参和实参只是在值上面一样,不是同一个内存数据对象。...另外我们为什么要使用指针不是直接传递 Student 变量呢?...指针常用在 C言中引用,则用于诸如 Java,C#等 在语言层面封装了对指针直接操作编程语言中。引用是编程语言提供给程序员抽象机制,指针是操作系统提供给软件开发模型抽象机制。...//这也就佐证了:在C言中,对于一个多字节数据,它地址就是它占用所有字节中地址值最小那个字节虚拟空间地址 //这也又说明了一个事实:C言中,一个多字节数据类型实例,占用虚拟内存空间是连续

56530

c语言进阶部分详解(详细解析动态内存管理)

/just-a-try: 学习c语言过程、真 (github.com) 今天来介绍动态内存管理 相关内容: 一.为什么存在动态内存分配 我们熟悉内存开辟方法: int a = 20;//在栈空间上开辟四个字节空间...这时候就只能试试动态存开辟了 各种变量存储位置: 二.动态内存函数介绍 2.1 malloc( )函数 malloc函数是C言中一个动态内存分配函数,用于在程序运行时动态地分配内存空间...(尽量避免,还是要free) 2.3calloc()函数 calloc函数是C言中一个内存分配函数,用于在堆上分配一块指定大小内存空间,并将该空间每个字节初始化为0 calloc函数原型为...如果size为0,那么realloc行为就相当于free,它会释放ptr指向内存空间,并返回NULL。...四.C/C++程序内存开辟 C/C++程序内存分配几个区域: 1.

9510

江哥带你玩转C语言 | 06-C语言运算符

运算符基本概念 和数学中运算符一样, C言中运算符是告诉程序执行特定算术或逻辑操作符号 例如告诉程序, 某两个数相加, 相减,相乘等 什么是表达式 表达式就是利用运算符链接在一起有意义...1 : 0; ---- 运算符优先级和结合性 早在小学数学课本中,我们就学习过"从左往右,先乘除后加减,有括号先算括号里面的", 这句话就蕴含了优先级和结合性问题 C言中,运算符运算优先级共分为...标准格式: sizeof(常量 or 变量); sizeof几种形式 sizeof( 变量\常量 ); sizeof(10); char c = 'a'; sizeof(c); sizeof 变量\...所以c结果是21 c = (a + 1, b + 1); printf("c = %i\n", c); // 21 } ---- 关系运算符 为什么要学习关系运算符 默认情况下,我们在程序中写每一句正确代码都会被执行...但很多时候,我们想在某个条件成立情况下才执行某一段代码 这种情况的话可以使用条件语句来完成,但是学习条件语句之前,我们先来看一些更基础知识:如何判断一个条件是否成立 ---- C言中真假性 在C

51400

C语言从入门到实战——动态内存管理

动态内存管理 前言 在C言中,动态内存管理是指程序运行时,通过调用特定函数动态地分配和释放内存空间。...C言中动态内存管理主要通过以下两个函数来实现: malloc函数:malloc函数用于动态分配内存空间,其函数原型为void *malloc(size_t size)。...五、动态内存经典笔试题分析 5.1 题目1: 调用函数传入指针,都是一级指针,按照变量来理解,需要用到二级指针来接收地址,不然如下p只是str一份临时拷贝,改变不了str void GetMemory...return 0; } 这样柔性数组成员a,相当于获得了100个整型元素连续空间。...(其实,我个人觉得也没多高了,反正你跑不了要用做偏移量加法来寻址) 扩展阅读:C⾔结构体⾥数组和指针 七、 总结C/C++中程序内存区域划分 C/C++程序内存分配几个区域: 栈区(stack

19710
领券