C语言strlen函数和sizeof操作符
2015-08-24 14:31
615 查看
字符'x'于字符串"x"的区别
'x' 属于基本类型(char)字符类型-----------------由1个字符组成('x')"x"属于派生类型(char数组)字符串类型-----------由2个字符组成('x'和空字符'\0')
strlen函数与sizeof操作符
strlen函数原型为 extern int strlen(char *s) ,用来计算字符串s的长度(不包括'\0'),使用时需要引入头文件 #include <string.h>
sizeof是C语言的一种单目操作符,同其他操作符++、--等类似,它并不是函数。其作用就是返回一个对象或者类型所占的内存字节数。
sizeof的示例程序:
#include <stdio.h> int main(void) { char* str1="absde"; //指向字符串的指针 char str2[]="absde"; char str3[8]={'a',}; printf("sizeof(str1) = %d\n",sizeof(str1)); printf("sizeof(str2) = %d\n",sizeof(str2)); printf("sizeof(str3) = %d\n",sizeof(str3)); return 0; }
运行结果:
【分析】
str1是一个指针,只是指向了字符串"absde"而已。所以sizeof(str1)不是字符串占的空间也不是字符数组占的空间,而是一个字符型指针占的空间。在C/C++中一个指针占4个字节,所以sizeof(str1)=4
str2是一个字符型数组。C/C++规定,对于一个数组,返回这个数组占的内存空间。"absde"中,共有'a','b','s','d','e','\0'六个字符,所以sizeof(str2)=6*sizeof(char)=6
str3已经定义成了长度是8的字符数组,分配了8个字节的内存空间,所以sizeof(str3)=8
总之,对于指针,sizeof操作符返回这个指针占的内存空间,一般是4个字节;而对于一个数组,sizeof返回这个数组所有元素占的总空间。char*与char[]容易混淆,一定要分清,而char* str1="absde"的写法现在也不被提倡,应予以避免。
关于二者的区别可见以下程序
#include <stdio.h> #include <string.h> //strlen函数的头文件 #define PRAISE "What a super marvelous name!" //测试字符串 int main(void) { char name[40] = "Wsying"; //测试字符串 printf("strlen = %d sizeof = %d\n",strlen(name), sizeof(name)); printf("strlen = %d sizeof = %d\n",strlen(PRAISE), sizeof(PRAISE)); return 0; }
运行结果:
【分析】
对于name这个字符数组(字符串),strlen的返回值6恰好为"wsying"的长度(‘\0’之前停止计数);因为我们声明了name数组包含了40个单位的char型,1个char型在内存中占据1个字节,所以sizeof的运算结果为name在内存中占据的字节数为40;
对于PRAISE(即"What a super marvelous name!")这个字符串,sizeof运算结果比strlen的结果大1,字符串占据的字节数(char类型仅占1个字节)比他的长度大1,这是因为sizeof把结束字符'\0'也算进去了('\0'也要占据内存空间),我们并没有像name那样定义为这个字符串分配多大内存,计算机自己计算它占据的字节数。
相关文章推荐
- POJ 2240 && ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
- C++实现红黑树与验证
- VC++6.0重命名Project名称及其MFC工程及类文件名
- 在Eclipse中搭建C/C++环境
- POJ C++程序设计 编程题#1 大整数的加减乘除
- 在windows上搭建C语言开发环境——借助eclipse和MinGW
- (转)C语言运算符优先级 详细列表
- C++ 入门教程(三) Hello World 程序讲解
- [LeetCode] Text Justification
- C++ 入门教程(二) 第一个C++程序:Hello World
- 图像处理职位面试题(图像处理+c++)
- Courses
- C++11实现for each(type var in collection)能识别的类
- c语言解析json数据
- 【C++】指针和引用
- 【more effective c++读书笔记】【第1章】基础议题(1)
- 【more effective c++读书笔记】【第1章】基础议题(1)
- 那些不能遗忘的知识点回顾——C/C++系列(笔试面试高频题)
- C++ Primer 5e chapter 15.2
- c++ 内存分配