strlen和sizeof的区别,以及extern的用法

c/c++中sizeof()、strlen()、length()、size()详解和区别 c/c++中获取字符串长度。有以下函数:size()、sizeof() 、strlen()、str.length(); 一、数组或字符串的长度:sizeof()、strlen() 1、sizeof():返回所占总空间的字节数 (1)、对于整型字符型数组 (2)、对于整型或字符型指针 2、strlen():返回字符数组或字符串所占的字节数 (1)、针对字符数组 (2)、针对字符 阅读详情
      strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。
 
strlen和sizeof的区别:
 
          strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到'\0'停止。
char aa[10];cout<<strlen(aa)<<endl; //结果是不定的
char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3
而sizeof()返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen是函数。
sizeof(aa) 返回10

int a[10]; sizeof(a) 返回40 (根据语言int型 c 是两个字节 c++是四个 java 是两个)


⒈sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
⒉sizeof是操作符(关键字),strlen是函数。
⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如:
short f();
printf("%d\n",sizeof(f()));
输出的结果是sizeof(short),即2。
⒋数组做sizeof的参数不退化,传递给strlen就退化为指针了。
⒌大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

⒏当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
⒐数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char [8])
fun(char [])

都等价于 fun(char *)


在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsiged char *p1,int len){  unsigned char* buf = new unsigned char[len+1]  memcpy(buf,p1,len);}
我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
char str[20]="0123456789";
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间的大小,不受里面存储的内容改变。
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的值所占的空间,应该是长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位
strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
sizeof返回对象所占用的字节大小. //正确

strlen返回字符个数. //正确


在使用sizeof时,有一个很特别的情况,就是数组名到指针蜕变,
char Array[3] = {'0'};
sizeof(Array) == 3;
char *p = Array;
strlen(p) == 1;//sizeof(p)结果为4
在传递一个数组名到一个函数中时,它会完全退化为一个指针
----------------------------------------------------------
看完以上你是否很清楚sizeof和strlen的区别了呢?还不明白的话,我们看下面几个例子:
第一个例子
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符
大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数,内部实现是用一个循环计算到\0之前为止
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以'\0'结尾的
char q[]="abc";
char p[]="a\n";
sizeof(q),sizeof(p),strlen(q),strlen(p);

结果是 4 3 3 2


第二个例子
class X{  int i;  int j;  char k;};X x;
cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐

cout<<sizeof(x)<<endl; 结果 12 同上


第三个例子
char szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
还有一位网友的说明也很好:
sizeof 只需要抓住一个要点:栈
程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针来间接操作的。sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。
char const * static_string = "Hello";
sizeof(static_string) 是 sizeof 一个指针,所以在 32bit system 是 4
char stack_string[] = "Hello";
sizeof(stack_string) 是 sizeof 一个数组,所以是 6 * sizeof(char)
char * string = new char[6];
strncpy(string,"Hello",6");
sizeof(string) 是 sizeof 一个指针,所以还是 4。和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。
不管指针指向的内容在什么地方,sizeof 得到的都是指针的栈大小
C++ 中对引用的处理比较特殊;sizeof 一个引用得到的结果是 sizeof 一个被引用的对象的大小;所以
struct O{  int a,b,c,d,e,f,g,h;};int main(){  O & r = *new O;  cout << sizeof(O) << endl; // 32  cout << sizeof r << endl; // 也是 32  system("PAUSE");}
r 引用的是整个的 O 对象而不是指向 O 的指针,所以 sizeof r 的结果和 sizeof O 完全相同。
自定义函数实现strlen()函数的功能
下面几种实现strlen函数的源代码大家参考
例1
#include <stdio.h>#include <assert.h>typedef unsigned int u_int;u_int Mystrlen(const char *str){  u_int i;  assert(str != NULL);  for (i = 0; str[i]!= '\0'; i++);  return i;}
例2
int strlen(const char *str){  assert(str != NULL);  int len = 0;  while((*str++) != '\0')    len++;  return len;}
例3
int strlen(const char *str){  assert(str);  const char *p = str;  while(*p++!=NULL);  return p - str - 1;}
例4
int strlen(const char *str){  assert(str);  if (*str==NULL)    return 0;  else    return (1 + strlen(++str));}
例5
/*** strlen - Find the length of a string* @s: The string to be sized*/size_t strlen(const char *s){  const char *sc;  for (sc = s; *sc != '\0'; ++sc)    /* nothing */;  return sc - s;}
以上各种实现的方式都是大同小异的,有的用的是变量,有的用的是指针。
其中,最后一个用的是递归的方式。其实,在实现库函数的时候,是规定不可以

调用其他的库函数的,这里只是给大家一个方法,不用变量就可以实现strlen。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、


strlen的原型是:
size_t strlen(const char*);
从中可以看出,strlen只接受const char*或char*的参数(或const char[]/char[]类型的能退化为对应指针的数组)。而对于元素类型为wchar_t的C风格宽字符串,则需要使用标准库函数wcslen代替strlen。
在C++中,以std::string为代表的字符串是class类型,它们的实例不能作为strlen的参数。要用strlen计算string的串长,可以用string的成员函数c_str()得到字符串指针后再调用(c_str()和data()类似,但是前者保证返回的内部存储的字符串指针后若干字节存在结束符,所以这里应该用前者)。但更推荐等价的方法,使用成员函数length()或size()(两者完全等价),可以利用string的内部实现保留的长度直接返回,而无需strlen从头开始对有效字符计数,相对而言效率高于strlen(字符串越长体现得越明显)。
具体示例:
string s = "123";
printf("%d\n",s.length());
printf("%d\n",s.size());
printf("%d\n",strlen(s.c_str()));
上面三条语句的作用是一样的,但前两条语句效率较高。
对于宽字符串,语法类似:
wstring ws = L"123";
printf("%d\n",ws.length());
printf("%d\n",ws.size());
printf("%d\n",wcslen(ws.c_str()));

3-C++ 关键字与关键库函数 sizeof的参数可以是类型,也可以是变量,且必须是完整类型;sizeof接受的参数可以是对象也可以是表达式,但是 sizeof(expression)在编译时不会对接受的表达式进行计算,编译器只会推导表达式的类型从而计算占用的字节大小;这意味着在函数内部使用sizeof 会得到指向字符类型的指针的大小,而不是原数组的大小,从下述程序的运行结果中就可以看出。strlen测量的是字符串的实际长度(其源代码如下),以 \0 结束,而 sizeof 测量的是对象或者表达式类型占用的字节大小。 阅读详情

相关推荐

高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入

一. 第一个重要极限 二. 第二个重要极限 三. 导数定义式 全文见【高等数学】两个重要的极限 - 知乎

"You are worthy! You can do it!" 6万+

sizeof和strlen的详细万字解读

意思就是,在计算机编译环境里面,当计算机编译环境是32位的时候此时地址的大小也就是4个字节当计算机编译环境是64位的时候,此时地址的大小也就是8个字节。

Jason_from_China的博客 1408

使用SAM进行遥感图像语义分割

SAM(Segment Anything Model)的成功表明了以数据为中心的机器学习的重要性。然而,由于遥感(RS)图像注释的困难和高成本,大量有价值的RS数据仍然没有被标记,特别是在像素级。在这项研究中,我们利用SAM和现有的RS物体检测数据集,开发了一个高效的管道来生成大规模的RS分割数据集,称为SAMRS。SAMRS在规模上超过了现有的高分辨率RS分割数据集几个数量级,并提供了物体类别、位置和实例信息,可用于语义分割、实例分割和物体检测,无论是单独还是组合。

lalula的博客 7449

【C++sizeof与strlen】C++sizeof与strlen底层原理精讲:计算规则、指针数组特例、字符串内存坑点、笔试真题全方位复盘

在C++笔试选择题、程序填空题、公司面试手撕题中,sizeof 和 strlen是出场率最高、正确率最低的基础考点,没有之一。绝大多数开发者看似每天都在用这两个函数,实则完全不懂底层执行机制,遇到数组、指针、字符串、结构体、嵌套类型、const修饰类型的混合场景,几乎全员踩坑。很多人固化两个错误认知:第一,认为sizeof是函数、strlen是关键字;第二,认为两者都可以计算字符串长度;第三,认为数组名永远代表整个数组大小。这三大误区,也是90%笔试错题的核心来源。

2401_86195313的博客 399

存储关键技术·RAID技术·RAID2.0·华为RAID2.0+·华为服务器·云计算

一.RAID基本概念 常见的RAID级别组合RAID级别 二.RAID的数据组织形式 三.RAID的数据保护功能 方法一:镜像方法二:奇偶校验算法(XOR) 四.RAID热备和重构 1.热备(Hot Spare)的定义2.热备的分类3.热备的工作原理 五.RAID 2.0技术 1.RAID 2.02.RAID 2.0+3.华为RAID 2.0+ 六.RAID 2.0+块虚拟化技术 1.什么会出现RAID 2.0+技术?2.什么是RAID 2.0?3.RAID 2.0+的原理是什么?

qq_47480932的博客 3319

告别玄学:手把手配置EtherCAT从站PDI接口与同步采样(含Sync/Latch信号实战)

本文详细解析了EtherCAT从站PDI接口配置与同步采样技术,涵盖微处理器通信与直接驱动IO模式选择、同步采样四大触发模式(SOF、Latch_in、Sync0/Sync1)及输出触发实战。通过伺服驱动器实例,帮助工程师突破配置难点,实现高精度同步控制,提升工业自动化系统性能。

weixin_30667649的博客 481

extern使用sizeof

在拥有多个文件的C项目之中,例如有三个文件,一个头文件palyer.h, 一个头文件的源文件 player.c ,一个 main.c ,在 player.c 中定义一个结构数组,然后,在 main.c 中使用sizeof(数组)/sizeof(元素)来获取其大小。但是, 如果该语句在main.c中使用会发生 “nvalid application of 'sizeof' to incomplete...

qq_38035641的博客 1204

汽车IVI中控开发入门及进阶(三):概述

开发板的作用当然是为了解决一些应用而设计的,主体是板,终极目的是应用,中间过程则是开发,是基于板的开发。可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到芯片上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。所以这些实现都是建构在汽车中控开发板的解决方案上的,最核心的当然就是一颗中控主控芯片,这是一颗国产中控双核DA主控芯片,AECQ100认证的车规级芯片。Q:uboot的作用是什么?

码农17年的博客 1406

sizeof的用法

1、什么是sizeof    首先看一下sizeof在msdn上的定义:    The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of

frank_1113的专栏 1189

使用HART Server PC软件进行HART设备的组态、调试和分析的完整指南

HART协议是一种用于工业自动化中的双向通信协议,能够在4-20mA模拟信号的基础上叠加数字信号,从而实现设备的远程监控和管理。HART协议兼具模拟和数字通信的优点,被广泛应用于过程控制系统中。设备组态:通过软件可以对HART设备进行组态,配置设备参数。设备调试:支持设备的在线调试和故障诊断,方便快速解决问题。数据分析:提供设备运行数据的实时监控和历史数据分析功能。报表生成:支持生成各类报表,便于数据记录和管理。

qq_38334677的博客 2468

人工智能算法面试大总结-总目录

涉及秋招、春招、社招

啥都生的博客 2万+

预习(二)strlen sizeof staic extern 的定义理解与区别

今天预习中对strlen,sizeof函数  “政权旗帜”static  “外来的和尚”ertern“进行详细的阅读和理解,书中没有用像课本那样的枯燥的方式解读,用一种幽默诙谐的方式反问我们,让我学习又多了些兴趣哈哈。不说没用的啦,下面是我整理的一些今天学习的内容。 1.strlen的详解 strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你

daimous的博客 323

YOLOv11 环境配置全流程 | 从零开始搭建训练与推理环境

YOLOv11环境配置与训练全流程指南 本文详细介绍了YOLOv11目标检测模型的环境配置、训练与推理全流程。内容包括: 环境要求:列出GPU、CUDA、Python等组件的版本要求,提供快速检查脚本 Windows配置: CUDA 12.6和cuDNN 8.9.7安装步骤 使用Conda创建隔离环境 PyTorch GPU版本安装方法 IDE环境配置 Linux配置:提供Ubuntu 22.04下的CUDA、cuDNN安装命令和Conda环境搭建 Docker方案:提供一键式容器化部署命令 训练实战: 数

shrgegrb的博客 2011

sizeof,strlen、sizeof的区别,new,delete,malloc,struct,union,volatile,extern C,memmove,memcpy,strcpy,atoi

文章目录strlen和sizeof的区别new和malloc如何判断是否申请到内存new实现原理delete实现原理,delete和delete[]的区别new和malloc的区别,delete和free搭配使用C和C++ struct的区别struct和union的区别class和struct的异同volatile的作用?是否具有原子性,对编译器有什么影响?什么情况下一定要用volatile,能否和const一起使用?extern C的作用memmove和memcpy的区别以及处理内存重叠问题memcpy

qq_36553387的博客 1163

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ALOT学习——小结:多文件编译、static与extern、strlen与sizeof、printf

每周小结 一、Linux系统下的多文件编译 为什么要多文件编译? 在编译的时候,特别是比较大的程序,若不拆分成多个文件,检查代码错误的过程将会是一个痛苦的过程;因此我们可以把一个完整的程序中的每一个函数分离开来,写成.c文件,最后一起编译和链接。 .h文件中一般是声明,包括:变量声明、宏定义、枚举声明、结构体声明、函数声明等。 .h头文件是对该模块(.c文件)接口的声明,接口包括该模块提供给其他模块调用的外部函数以及外部全局变量。其他模块访问这些外部定义的变量和函数都需要在.h文件中冠以extern关键字声

qq_35997213的博客 323

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C语言常见面试题 笔试题 总结 makefile const和#define的区别 地址重叠 Memcpy sizeof和 strlen 大小端转换 堆和栈的区别 内存管理 static,extern

从.C文件到可执行文件具体流程,指针的作用 具体流程: 1、预处理:把源文件翻译成预处理文件 gcc -E code.c 显示与处理结果 gcc -E code.c -o code.i 生成以.i 结尾的预处理的文件 2、编译:把预处理文件翻译成汇编文件 gcc -S code.i 默认生成以.s 结尾的汇编文件 3、汇编:把汇编文件翻译成二进制的目标文件 gcc -c code.s 默认生

grooveHong的博客 455

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

嵌入式C语言编程基础(一)

因此,前者具有类型检查,而后者没有;const常量具有作用域,只在定义它的作用域内有效,而宏定义常量没有作用域,可以在文件的任何地方使用;

weixin_43851154的博客 1126

C语言 存储类型 关键字

概述:存储类定义 C语言程序中变量/函数的存储位置、生命周期和作用域。

临界三级管的博客 1880

嵌入式基础知识---C笔记一(关键字)

C语言学习笔记

qq_48954006的博客 1077

c关键字学习

uion里面最大的变量类型是int[5],所以占用20个字节,它的大小是20,而 由于 union中 double占了8个字节,因此 union是要8个字节对齐,所占内存空间为8的倍数。对于所有的对象(不仅仅是静态对象),初始化都只有一次,而由于静态变量具有“记忆”功能,初始化 后,一直都没有被销毁,都会保存在内存区域中,所以不会再次初始化。1.不同之处在于联合体中所有成员共 用一块地址空间,即联合体只存放了一个被选中的成员,而结构体中所有成员占用空间是累加的,一个联合型变量的长度等于其最长的成员的长度。

syx99的博客 930

嵌入式面试常见问题(一)(1)

1)用static修饰局部变量:使其变为静态存储方式(静态数据区),那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中。2)用static修饰全局变量:使其只在本文件内部有效,而其他文件不可连接或引用该变量。3)用static修饰函数:对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的(这一点在大工程中很重要很重要,避免很多麻烦,很常见)。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。

2401_87556928的博客 1059

面试准备每日五题:C++(六)——C&C++、static&const&extern、sizeof & strlen、指针&引用、数组指针&指针数组&函数指针

文章目录一、C和C++的区别是什么?二、关键字static、const、extern作用三、sizeof和strlen的区别四、指针和引用的区别五 、指针数组、数组指针、函数指针 一、C和C++的区别是什么? C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。 C中函数不能进行重载,C++函数可以重载 C++在C的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)

CodeLuweir 的博客 707

C语言-----总结

一、strlen与sizeof的区别: 1、strlen计算字符串的具体长度(只能是字符串),不包括字符串结束符。返回的是字符个数。 2、sizeof计算声明后所占的内存数(字节大小),不是实际长度。 3、sizeof是一个取字节运算符,而strlen是个函数。 例: int i; int j; char str[11]=“012345...

长安 787

c 初始化char**_阿里百度腾讯 C/C++ 面试题总结,我全都告诉你!

一、C和C++的区别是什么?C是面向过程的语言,C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C中函数不能进行重载,C++函数可以重载C++在C的基础上增添类,C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合...

weixin_35589827的博客 150

嵌入式软件工程师面试题——2025校招社招通用(C/C++)(三十六)

嵌入式面试题-C/C++

weixin_45257157的博客 1467

嵌入式C语言面试题笔试题

(1)typedef是用来定义一种数据类型的别名,增强程序的可读性。(2)执行时间不同:typedef是编译过程的一部分,有类型检查的功能。define是宏定义,是预编译的部分,其发生在编译之前。(2)Strlen是求以\0结尾的字符串的实际长度,是一个函数,在运行时才运算出结果,使用strlen求长度时候要进行初始化。Volatile修饰的变量说明该变量的值会随时发生变化的,每次用的时候需要从存储该变量的地址中直接获取。(4)对指针的操作不同:typedef和define定义的指针时有很大的区别。

dddds222_的博客 508
上一篇: cuda与openGL互操作
下一篇: 不能联网的一些原因及测试排除
tkp2014
博客等级 码龄12年 137粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值