掌握聚合最新动态了解行业最新趋势
API接口,开发服务,免费咨询服务

C语言中sizeof和strlen区别并举例说明

在C语言中,理解内存管理和数据类型的大小是非常重要的。sizeof和strlen是两个常用的操作符和函数,但它们有着不同的用途和行为。本文将详细介绍它们的区别,并通过多个例子帮助读者更好地理解它们的用法和区别

一、sizeof与strlen的基本概念

sizeof:sizeof是一个单目运算符,用于计算变量或类型的存储大小(以字节为单位)。它在编译时进行计算,这意味着它不会对表达式求值,而是根据变量的类型来决定其大小。例如,对于一个整型数组,sizeof会告诉你整个数组占用的内存大小,包括所有元素和结尾的空字符(如果有的话)。

strlen:strlen是一个库函数,用来计算字符串的长度,不包括结尾的空字符('\\0')。它是一个运行时函数,需要包含头文件#include。strlen通过遍历字符串直到遇到空字符来计数,因此它只能用于以空字符结尾的字符串。

二、sizeof与strlen的区别

  1. 用途不同:sizeof用于计算数据类型或变量在内存中占用的字节数,而strlen用于计算字符串的长度(不包括结束符)。

  2. 参数类型:sizeof可以作用于任何基本数据类型、结构体、联合等,而strlen只能作用于以null结尾的字符串。

  3. 执行时间:sizeof在编译时处理,而strlen在运行时处理。

  4. 返回值:sizeof返回的是变量或类型所占的内存大小(字节数),而strlen返回的是字符串的实际长度(字符数)。

  5. 使用场景:当你需要知道一个变量或数据结构在内存中占用多少空间时,使用sizeof;当你需要获取一个字符串的长度时,使用strlen。

sizeof与strlen的区别

三、典型例题解析

  1. 计算字符数组的长度

   #include 
   #include 
   int main() {
       char arr1[] = "hello bite!";
       // sizeof(arr1) 计算整个数组的大小,包括所有字符和末尾的 '\0'
       printf("Size of arr1: %zd bytes
", sizeof(arr1)); // 输出 12
       // strlen(arr1) 计算字符串的长度,不包括 '\0'
       printf("Length of string in arr1: %zd characters
", strlen(arr1)); // 输出 11
       return 0;
   }
  1. 计算整型数组的大小

   #include 
   int main() {
       int arr2[5] = {0};
       // sizeof(arr2) 计算整个数组的大小
       printf("Size of arr2: %zd bytes
", sizeof(arr2)); // 输出 20 (假设整型为4个字节)
       // strlen不能用于非字符数组
       // printf("Length of arr2: %zd
", strlen(arr2)); // 这是错误的,因为strlen只适用于字符数组
       return 0;
   }
  1. 指针与数组的区别

   #include 
   #include 
   int main() {
       char *str1 = "abcdefg";
       char str2[] = "abcdefg";
       // sizeof(str1) 计算指针本身的大小
       printf("Size of str1: %zd bytes
", sizeof(str1)); // 输出 8 (64位系统上指针大小为8个字节)
       // strlen(str1) 计算字符串的长度
       printf("Length of string pointed by str1: %zd characters
", strlen(str1)); // 输出 7
       // sizeof(str2) 计算数组的大小,包括所有字符和末尾的 '\0'
       printf("Size of str2: %zd bytes
", sizeof(str2)); // 输出 8
       // strlen(str2) 计算字符串的长度
       printf("Length of string in str2: %zd characters
", strlen(str2)); // 输出 7
       return 0;
   }
  1. 结构体大小的计算

   #include 
   struct Point {
       int x;
       int y;
   };
   int main() {
       struct Point p;
       // sizeof(p) 计算结构体的大小
       printf("Size of struct Point: %zd bytes
", sizeof(p)); // 输出依赖于编译器和平台,通常是8或16
       return 0;
   }

四、注意事项

在使用sizeof和strlen时,有几个常见的陷阱需要注意:

  1. sizeof操作符在编译时处理,因此它不会被括号包围的形式所影响,无论是sizeof(var)还是sizeof var都是正确的。

  2. strlen只能用于以空字符结尾的字符串。如果尝试对一个不是以空字符结尾的字符数组使用strlen,结果将是未定义行为。

  3. 当传递一个数组名给一个函数时,实际上传递的是指向数组首元素的指针,因此在函数内部使用`sizeof`得到的是指针的大小而不是数组的大小。

  4. 如果需要计算动态分配的内存块的大小,应该保存原始的大小信息,因为一旦内存被分配,就无法仅通过指针来确定其大小。

本文介绍了C语言中sizeof和strlen的区别,并提供了多个示例来说明它们的用法。希望这些内容能帮助你更好地理解和应用这两个重要的操作符和函数。

声明:所有来源为“聚合数据”的内容信息,未经本网许可,不得转载!如对内容有异议或投诉,请与我们联系。邮箱:marketing@think-land.com

  • 双人婚姻登记状态核验

  • AI新闻简报

    最新新闻资讯简报,各类国内、国际、体育、娱乐、科技等资讯AI智能总结摘要及详细内容,适合各类AI Agent、穿戴设备进行资讯播报、阅读。

    最新新闻资讯简报,各类国内、国际、体育、娱乐、科技等资讯AI智能总结摘要及详细内容,适合各类AI Agent、穿戴设备进行资讯播报、阅读。

  • 运营商5G基站信息

    通过传递运营商2G/3G/4G/5G基站的MCC、MNC、TAC、CID信息查询所在位置信息。为用户提供位置服务,如实时导航、周边推荐等。

    通过传递运营商2G/3G/4G/5G基站的MCC、MNC、TAC、CID信息查询所在位置信息。为用户提供位置服务,如实时导航、周边推荐等。

  • 人脸实名认证2.0

    通过身份证号+姓名+人脸照片的一致性比对,系统与公安库中的身份证登记照比对,判断是否为同一人,核验用户信息真实性。

    通过身份证号+姓名+人脸照片的一致性比对,系统与公安库中的身份证登记照比对,判断是否为同一人,核验用户信息真实性。

  • 企业招投标信息

0512-88869195
客服微信二维码

微信扫码,咨询客服

数 据 驱 动 未 来
Data Drives The Future