前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >sizeof,sizeof与strlen的区别

sizeof,sizeof与strlen的区别

作者头像
用户11328191
发布2024-10-23 14:26:33
发布2024-10-23 14:26:33
9700
代码可运行
举报
文章被收录于专栏:li_waitli_wait
运行总次数:0
代码可运行

一.sizeof介绍

代码语言:txt
复制
    sizeof是一个关键词也是操作符,专门用来计算类型或者变量大小,其实sizeof也可以计算数组的大小,单位都是字节。sizeof是一个非常有用的工具:
  1. 确定数据结构的大小。
  2. 分配内存。
  3. 比较不同数据类型或变量的大小。
  4. 避免缓冲区溢出。
代码语言:txt
复制
    sizeof操作符的操作数可以是类型,也可以是变量或者表达式。

sizeof(类型) sizeof 表达式

  • sizeof的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号。
  • sizeof后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。
  • sizeof的计算结果是size_t类型的。

( size_t:

sizeof运算符的返回值,C语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定,sizeof到底返回什么类型。不同的系统中,,返回值的类型有可能是unsigned int,也有可能是unsigned int,甚至是unsigned long long,对应的printf()占位符是%u ,%lu,%llu 。这吧利于程序的可移植性。

C语言提供了一个解决方法,创造了一个类型别名size_t,用来统一表示sizeof的返回值类型。对应当前系统的sizeof的返回值类型,可能是unsigned int,也可能是unsigned long long。)

比如:

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	int a=10;
	printf("%zd\n", sizeof(a));
	printf("%zd\n", sizeof a);//a是变量的名字,可以省略掉sizeof后边的()
	printf("%zd\n", sizeof(int));
	printf("%zd\n", sizeof (3 + 3.5));
	return 0;
}

运算结果:


代码语言:txt
复制
    当我们占位符使用%d时,编译器会报错,但程序能运行 

如:

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	printf("%d\n", sizeof(arr));
	return 0;
}//返回40

1.1sizeof中表达式不计算

代码语言:txt
复制
    在sizeof运算符中,表达式不会被计算,因为sizeof运算符返回的是数据类型的字节数,而不是表达式的值。表达式仅用于确定数据类型。
代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	short i = 2;//字节为2
	int j = 10;
	printf("%zd\n", sizeof(i = j + 1));
	printf("i=%d\n", i);
	return 0;
}

运行结果:

这是因为sizeof运算符返回的是short类型的字节数,而不是i=j + 1表达式的值。

1.2sizeof计算数组大小

数组大小=有效元素个数(包括\0和空白字符)*每个元素的字节

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	char arr[] = "abc  def";
	printf("%d\n", sizeof(arr));
	return 0;
}//输出9
代码语言:txt
复制
    由于字符串末尾自动放置‘\0’,中间有三个空格,因此该数组有9个元素。9\*1=9

练习:下面代码的结果是:

代码语言:javascript
代码运行次数:0
复制
#include <stdio.h>
int main()
{
    int arr[] = {1,2,(3,4),5};
    printf("%d\n", sizeof(arr));
    return 0;
}

答案:16 因为该数组是一维数组,(3,4)为逗号表达式,表达式从左向右计算,值为最后一个表达式的值,arr2=4(数组:https://blog.csdn.net/wait___wait/article/details/135208488

1.3sizeof计算数组元素个数

代码语言:javascript
代码运行次数:0
复制
#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);//数组大小/每个元素的字节
	printf("%d\n", sz);
	return 0;
}//打印10

二.strlen

代码语言:txt
复制
    strlen 是一个 C 语言库函数,它返回一个字符串的长度(不包括\0)。头文件为string.h。

size_t strlen(const char *str)

  • str 是要计算长度的字符串。
  • size_t是一个无符号整数类型,用于表示字符串的长度。
  • strlen 函数的返回值是字符串的长度,不包括字符串结尾的空字符('\0')。

三. sizeof与strlen的区别

代码语言:txt
复制
求数组元素下标     
代码语言:javascript
代码运行次数:0
复制
//求数组元素下标
char arr[]="abcdef";
int right1=strlen(arr)-1;//由于数组下标从0开始,所以求得的字符串长度要减1
int right2=sizeof(arr)/sizeof(arr[0])-2;//sizeof计算'\0'的长度,所以要减2

求数组大小

代码语言:javascript
代码运行次数:0
复制
char arr1[]="abcdefg";//末尾有\0
char arr2[]={'a', 'b','c','d','e','f','g'};//末尾没有\0
printf("%zd\n", sizeof(arr1));
printf("%zd\n", sizeof(arr2));
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));//随机值

运行结果:

代码语言:txt
复制
**由于 strlen从首元素开始计算,遇到‘\0’停止,若无‘\0’,则结果是随机值。**

练习:下面代码的结果是:

代码语言:javascript
代码运行次数:0
复制
#include <stdio.h>
int main()
{
    char str[] = "hello bit";
    printf("%d %d\n", sizeof(str), strlen(str));
	  return 0;
}

答案:10 9

期待

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.sizeof介绍
  • 1.1sizeof中表达式不计算
  • 1.2sizeof计算数组大小
  • 1.3sizeof计算数组元素个数
  • 二.strlen
  • 三. sizeof与strlen的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档