今天,在使用字符串的时候,对sizeof和strlen的用法更加深入了,特此记录下。

strlen是运行是计算的,不能放在函数外面计算的
sizeof是预编译时运行的,可以放在函数外面计算。

对于char a[]="asdc"这样的定义,sizrof(a)的值是5,因为末尾会自动添加一个'\0',而strlen(a)的值=4,不计算'\0',

对于char a[8]="asdc"这样的定义,sizeof(a)的值是8,因为数组a在定义的时候已经大小定好了,最大就是8,而strlen(a)的值依然=4,不计算'\0',因为在实际内存中,保存的是"asdc\0"。

对于char *a="asdcf"这样的定义,sizrof(a)的值是4(32位系统)或8(64位系统),因为这个a其实是一个指针,指向字符常量。无论后面的字符串多长,都是上面的数值。而strlen(a)的值=5,不计算'\0',其实知道strlen的自定义实现,就知道了strlen含义。

在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示
第一种表示方式固定了每个字符串的最大大小。第二种没有字符串的大小限制。
对于如下定义,month首先是一个数组,但是,但他里面存的是指针,所以说指针数组,所以sizeof(month)的大小是12×8(64位系统)=96;sizeof(month[0])=8,即一个指针的大小。
strlen(month[0]) = 7,即"January"的长度是7,而
strlen(month)无意义,语法非法。编译器报错:warning: assignment from incompatible pointer type
char *month[] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"};

对于以下定义,month首先是一个一维数组,但是每个子数组中,都是一个字符串,因此是一个二维数组,我这里为每个子数组定义的大小是15,显然,很多数组没有全部用完。所以sizeof(month[0])的大小是15;即一个子数组的大小。
strlen(month[0]) = 7,即"January"的长度是7,
而strlen(month)无意义。编译器报错:expected 'const char *' but argument is of type 'char (*)[15]' _CRTIMP size_t __cdecl __MINGW_NOTHROW strlen (const char*) __MINGW_ATTRIB_PURE;

char month[][15] = {
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"};

再论strlen sizeof的更多相关文章

  1. c/c++ 常见字符串处理函数总结 strlen/sizeof strcpy/memcpy/strncpy strcat/strncat strcmp/strncmp sprintf/sscanf strtok/split/getline atoi/atof/atol

    这里总结工作中经常用到的一些c/c++的字符串处理方法,标黑的是使用频率较高的   1.strlen函数:计算目标字符串长度,    格式:strlen(字符指针指向区域) 注意1:①不包含字符串结束 ...

  2. strlen sizeof strcat strcpy区别

      strlen(p): 能计算出p指向字符串的长度(以当前p的位置开始),不包含终止字符'\0': p可以声明为char* p或者char p[],这两种形式strlen均能正确计算. sizeof ...

  3. 转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端

    写出如下程序运行结果: #include<stdio.h> #include<string.h> int main() { int a[2000]; char *p = (ch ...

  4. C笔试题:将int型数组强制转换为char*,再求strlen,涉及大小端

    1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 int a[2000]; 6 char *p = (ch ...

  5. Strcmp(字符串1,字符串2)函数 Sizeof && strlen() Substr(a,b)

    Strcmp(字符串1,字符串2)函数 { strcmp函数是比较两个字符串的大小,返回比较的结果.一般形式是:  i=strcmp(字符串,字符串); 其中,字符串1.字符串2均可为字符串常量或变量 ...

  6. sizeof和strlen的区别和联系总结

    link:http://blog.csdn.net/ghevinn/article/details/9974967    strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头 ...

  7. 【转载】strlen与sizeof区别

    自己小结: sizeof使用时,若是数组变量,则是数组变量占的大小 char a[10]; sizeof(a)=10 若是指针,则为指针大小,数组变量作为函数参数传递时,会退化成指针,且函数内是不知道 ...

  8. [基础]sizeof和strlen

    转自网络 首先切记,sizeof不能用来求字符串长度 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能容纳实现所建立的最大对象的字 ...

  9. strlen函数细节

    strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值. 原型: ...

随机推荐

  1. QT/C++ 类型转换

    "轻轻地我走了,正如我轻轻地来,我挥一挥衣袖,不带走一片云彩"------阿魔 1) int转为QString: QString::number(int) 2) std::stri ...

  2. RDP Error: The Identity Of The Remote Computer Cannot Be Verified

    As i always need to remote to 20 servers at the same time, so i use a tool called Remote Desktop Con ...

  3. 为什么Apache Kafka如此受欢迎

    1.目标 今天,在这个Kafka教程中,我们将学习所有Kafka功能,如可扩展性,可靠性,耐用性,这些都说明了Kafka如此受欢迎的原因.我们将详细讨论Kafka的每个功能.但在那之前让我们明白什么是 ...

  4. STS,修改Ctrl+Shift+R匹配类的配置

    在使用STS(Spring Tools)时,每次通过Ctrl+Shift+R查询类时,会出来一堆不想看到的类.如下所示: 上面的.class文件和父项目中的.java文件,在匹配类时,是不想看到的. ...

  5. Java基础笔试练习(九)

    1.下面所示的java代码,运行时,会产生()类型的异常 ? int Arry_a[] = new int[10]; System.out.println(Arry_a[10]); A.Arithme ...

  6. Hbase面试题

    hbase的特点 )hbase适合存储海量数据,是一个分布式的,基于列式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理. )hbase 适合存储半结构化或非结构化的数据,对于 ...

  7. 链表习题(8)-寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下

    /*寻找单链表中数据域大小为k的结点,并与前一结点交换,如果前一结点存在的情况下*/ /* 算法思想:定义两个指针,pre指向前驱结点,p指向当前结点,当p->data == k的时候,交换 p ...

  8. 【LEETCODE】55、数组分类,适中级别,题目:79、611、950

    第950题,这题我是真的没想到居然会说使用队列去做,大神的答案,拿过来瞻仰一下 package y2019.Algorithm.array; import java.util.HashMap; imp ...

  9. 【LEETCODE】53、数组分类,简单级别,题目:989、674、1018、724、840、747

    真的感觉有点难... 这还是简单级别... 我也是醉了 package y2019.Algorithm.array; import java.math.BigDecimal; import java. ...

  10. 在jenkins中使用shell命令推送当前主机上的docker镜像到远程的Harbor私有仓库

    1.jenkins主机上的docker配置 先在Jenkins主机的docke上配置上Harbor私有仓库地址 cat /etc/docker/daemon.json { "insecure ...