获取char*字符串指针指向的数组长度时,记得用strlen,而不是sizeof

 一、示例说明区别

1.1 针对char*

strlen和sizeof的区别用以下示例说明:

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char str[] = "Hello, World!";  
    char *ptr = str;  
  
    // 使用sizeof计算ptr的大小(注意这里的陷阱)  
    printf("Size of ptr (pointer size): %zu\n", sizeof(ptr));  
  
    // 使用strlen计算ptr指向的字符串的长度  
    printf("Length of string pointed by ptr: %zu\n", strlen(ptr));  
  
    return 0;  
}

函数输出结果 

 

Size of ptr (pointer size): 4 或 8  
Length of string pointed by ptr: 13

 这里的48取决于系统指针的大小。在32位系统上,指针通常是4个字节;在64位系统上,指针通常是8个字节。

解释

  • sizeof(ptr): 这里ptr是一个指针变量,sizeof计算的是指针变量本身所占的内存字节数,而不是指针所指向的内存区域的大小。因此,它返回的是指针在特定平台上的大小(通常是4或8个字节)。

  • strlen(ptr): 这里ptr被当作一个指向字符数组(字符串)首元素的指针。strlen函数遍历这个字符串,直到遇到\0字符为止,并返回遇到的\0之前的字符数。因此,对于指向"Hello, World!"的指针,strlen返回的结果是13。

注意事项

  • 使用sizeof与指针时,要特别注意它返回的是指针本身的大小,而不是指针所指向的内存区域的大小。
  • 使用strlen时,必须确保传递给它的指针确实指向了一个以\0结尾的字符串。如果指针没有指向有效的字符串或指向的内存区域不包含\0,那么strlen的行为将是未定义的,可能会导致程序崩溃或返回错误的结果。
  • 在处理动态分配的字符串(如使用malloccalloc分配的内存)时,sizeof无法用来获取字符串的长度,因为sizeof只能用于计算静态分配的对象或类型的大小。对于动态分配的字符串,你应该使用strlen来获取长度,或者使用额外的变量来跟踪字符串的长度。

 1.2 针对char数组

#include <stdio.h>  
#include <string.h>  
  
int main() {  
    char str[] = "Hello, World!";  
  
    // 使用sizeof计算str所占的内存字节数  
    printf("Size of str (in bytes): %zu\n", sizeof(str));  
  
    // 使用strlen计算str的长度(不包括'\0')  
    printf("Length of str (excluding '\\0'): %zu\n", strlen(str));  
  
    return 0;  
}

 函数输出结果 

注意:实际上,由于字符串"Hello, World!"\0结尾,它在内存中占用的空间是14个字节(包括13个字符和1个结尾的\0)。但是,strlen函数只计算到\0之前的字符数,因此返回13。而sizeof操作符计算的是整个数组(包括结尾的\0)所占的字节数,因此返回14。

解释

  • sizeof(str): 这里str是一个字符数组,sizeof操作符计算的是整个数组所占的内存字节数,包括数组中所有字符和结尾的\0。在大多数情况下,字符(char)在内存中占用1个字节,但sizeof计算的是整个数组所占的空间,即12个字符 + 1个\0 = 13个字节

  • strlen(str): 这里str被当作一个指向字符数组首元素的指针传递给strlen函数。strlen函数遍历这个字符串,直到遇到\0字符为止,并返回遇到的\0之前的字符数。因此,对于字符串"Hello, World!"strlen返回的结果是12。

通过这个案例,我们可以清晰地看到sizeofstrlen在使用上的区别:sizeof用于获取对象或类型在内存中的大小(以字节为单位),而strlen用于获取以\0结尾的字符串的长度(以字符为单位,不包括\0)。

二、sizeof

定义
sizeof是C语言(以及C++)中的一个操作符,用于在编译时计算对象或类型所占的内存字节数。

用法

  • 可以用于基本数据类型(如intfloatchar等),此时它返回该类型对象所占的字节数。
  • 可以用于数组,此时它返回整个数组所占的内存字节数,而不是数组的长度(即元素个数)。
  • 可以用于结构体和联合体,此时它返回结构体或联合体所占的内存字节数。
  • 可以用于指针,此时它返回指针本身所占的字节数,而不是指针所指向的内存区域的大小。
  • 也可以用于类型(使用括号括起来),如sizeof(int)

返回值
sizeof的返回值是一个无符号整数(size_t),表示所计算对象或类型所占的内存字节数。

三、strlen

定义
strlen是C语言(以及C++)中的一个标准库函数,用于计算以'\0'结尾的字符串的长度(不包括结尾的'\0')。

用法

  • strlen的参数是一个指向字符的指针,通常是一个字符数组(字符串)的首地址。
  • 它遍历字符串,直到遇到第一个'\0'字符,然后返回遇到的'\0'之前的字符数。

返回值
strlen的返回值也是一个无符号整数(size_t),表示字符串中字符的数量(不包括结尾的'\0')。

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值