sizeof()和strlen()用法

本文详细解释了C/C++中sizeof运算符与strlen函数的区别及使用方法。sizeof用于获取对象或类型的字节大小,而strlen用于测量以null结尾的字符串长度。文章通过多个示例展示了它们在不同类型和上下文中的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、sizeof( )是运算符,不是函数。

      在编译时计算,因此不能用来返回动态分配(malloc)的内存空间的大小。

2、strlen( )是函数,要在运行时才能计算。

      函数的参数必须是字符型指针(char *),必须是以'\0'结尾的。

      strlen所作的仅仅是一个计数器的工作,它从内存的某个位置开始计算,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含“\0”)。

注意:当数组名作为strlen的函数参数传入时,实际上数组就退化成指针了。

举例1:    

char *s = "0234567";
sizeof(s); 结果 4 ===》s是指向字符串常量的字符指针
sizeof(*s); 结果 1 ===》*s是第一个字符
//大部分编译程序,在编译的时候就把sizeof计算过了,是类型或是变量的长度

举例2:

char arr[10] = "Hello";
int len_str = strlen(arr);
int len_sizeof = sizeof(arr); 
cout << len_str << " and " << len_sizeof << endl; 
//输出结果为:5 and 10
当arr是数组时,sizeof返回的是编译器为其分配的数组空间大小,不关心里面存了多少数据。

strlen只关心存储的数据内容,不关心空间的大小和类型。

注意:sizeof在不同平台的值并不一样

举例3:

char szPath[MAX_PATH];
//如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH
//但是将szPath作为虚参声明时
void fun(char szPath[MAX_PATH]);
sizeof(szPath);却会是4(指针大小)

其实理解 sizeof 只需要抓住一个要点:栈

程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;

动态和静态存储区是靠栈上的指针来间接操作的。sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。

#include "iostream"
using namespace std;
class Base  
{  
	virtual void VirtualFun();  
};  
class D1:Base  
{  
	int i;  
    void NonVirtualFun();  
};  
class D2:D1  
{  
    D1 *pD2;  
};  
class D3:D2  
{  
    static int i;  
    static int GetIndex();  
};  
void main()  
{  
    printf("%d\n",sizeof(Base));//4 虚函数(虚函数表)会占4个字节,一个类至少有1个字节(char型)来区分不同的类  
    printf("%d\n",sizeof(D1));	//8 函数不算在内,int是4个字节  
    printf("%d\n",sizeof(D2));	//12 比上一个多了一个指针  
    printf("%d\n",sizeof(D3));	//12 static类型的变量(函数)不算在对象内,整个类共享  
    system("pause");  
}  

#include <stdio.h>  
int main()  
{  
    printf("%d\n", sizeof(int));     // 4  
    printf("%d\n", sizeof(long));    // 4
    printf("%d\n", sizeof(float));   // 4  
    printf("%d\n", sizeof(double));  // 8  
    printf("%d\n", sizeof(void*));   // 4 指针类型的为4 
    return 0;  
} 
#include <stdio.h> 
#include<string.h> 
int main()  
{  
    char *s="hello";
    printf("%d\n", sizeof(s));   // 4 指针类型的为4 
    printf("%d\n", sizeof(*s));  // 1 指向字符串的首地址 为1
    printf("%d\n", strlen(s));   // 5 长度为5 不包括'\0'
    //s[0]='a'; //编译时没有错误 但是运行时会出现停止运行 常量字符串
    puts(s);
    return 0;   
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值