C语言——字符串中sizeof和strlen的辨析

在C语言中,sizeofstrlen 函数在处理字符串时有明显不同的作用和结果。

sizeof

  • 定义sizeof 是一个编译时操作符,用于获取对象或类型在内存中占用的字节数。
  • 字符串中的行为:当 sizeof 应用于字符串(实际上是字符数组)时,它返回的是整个数组所占用的字节数,包括字符串的结尾空字符 '\0'。但是,这个大小是在编译时就确定的,与字符串在运行时实际包含的字符数无关。
示例:
#include<stdio.h>
#include<string.h>

int main()
{
	char cdata[] = "hello";
	char *pdata = "hello";
	char cdata2[128] = "hello";
	
	printf("sizeof cdata:   %d\n",sizeof(cdata));
	printf("sizeof pdata:   %d\n",sizeof(pdata));
	printf("sizeof cdata2:  %d\n",sizeof(cdata2));
	return 0;
}

输出:

sizeof cdata:   6
sizeof pdata:   8
sizeof cdata2:  128

由此可见sizeof计算字符串长度时是包括,字符串结尾默认的 '\0 ' 的。同时在使用字符数组定义时,如果声明时给定了数组大小,而有效字符数不足时会默认补 '\0 ' 并计入字符串长度的。在使用指针定义时,由于pdata本身就是一个指针,而且C语言中用8个字节保存一个地址,所以其输出为8。

strlen

  • 定义strlen 是一个函数,定义在 <string.h> 头文件中,用于计算以 '\0' 结尾的字符串的长度(不包括结尾的空字符 '\0')。
  • 字符串中的行为strlen 在运行时遍历字符串,直到遇到第一个 '\0' 字符,然后返回它之前字符的数量。这意味着 strlen 的返回值依赖于字符串在内存中的实际内容。
示例:
#include<stdio.h>
#include<string.h>

int main()
{
	char cdata[] = "hello";
	char *pdata = "hello";
	char cdata2[128] = "hello";

	printf("strlen cdata:   %d\n",strlen(cdata));
	printf("strlen pdata:   %d\n",strlen(pdata));
    printf("strlen cdata2:   %d\n",strlen(cdata2));
	return 0;
}

输出:

strlen cdata:   5
strlen pdata:   5
strlen cdata2:  5

从输出可以看出,在定义字符串数组时,无论是否声明数组长度,strlen函数都只会计算有效字符的长度,而且不包含 ' \0 '。

总结

  • sizeof 在编译时确定对象或类型的大小,对于字符串(字符数组)来说,它返回的是整个数组的大小,包括未使用的空间和结尾的空字符。
  • strlen 在运行时计算字符串的长度,即字符串中字符的数量(不包括结尾的空字符),它依赖于字符串的实际内容。

在处理字符串时,正确选择 sizeof 和 strlen 非常重要,因为它们的返回值和用途截然不同。

相关推荐

  1. C语言——字符串sizeofstrlen辨析

    2024-07-23 05:32:02       36 阅读
  2. C语言数组指针sizeofstrlen详解

    2024-07-23 05:32:02       71 阅读
  3. c语言版)strlensizeof区别

    2024-07-23 05:32:02       53 阅读
  4. C语言sizeofstrlen区别

    2024-07-23 05:32:02       66 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-23 05:32:02       171 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-23 05:32:02       189 阅读
  3. 在Django里面运行非项目文件

    2024-07-23 05:32:02       157 阅读
  4. Python语言-面向对象

    2024-07-23 05:32:02       170 阅读

热门阅读

  1. “微软蓝屏”事件暴露了网络安全哪些问题?

    2024-07-23 05:32:02       40 阅读
  2. 创建多语言文档:步骤、好处和最佳实践

    2024-07-23 05:32:02       34 阅读
  3. C++中的引用与指针介绍

    2024-07-23 05:32:02       38 阅读
  4. ElasticSearch-分词器介绍

    2024-07-23 05:32:02       33 阅读
  5. Git基本使用

    2024-07-23 05:32:02       37 阅读
  6. 深入理解Spring Boot中的Fastjson

    2024-07-23 05:32:02       33 阅读
  7. 【Golang 面试基础题】每日 5 题(四)

    2024-07-23 05:32:02       29 阅读