C/C++——sizeof和strlen的区别
2016-01-14 20:04
477 查看
题目1(腾讯11年笔试题):
#include <stdio.h> #include <string.h> void func(char str_arg[100]) { printf("\nstr_arg = %s\n", str_arg); printf("sizeof(str_arg) = %d\n", sizeof(str_arg)); printf("strlen(str_arg) = %d\n", strlen(str_arg)); } int main() { char str[] = "Hello";//注意和char * str = "Hello";是不一样的结果 printf("str = %s\n", str); printf("sizeof(str) = %d\n", sizeof(str)); printf("strlen(str) = %d\n", strlen(str)); char * p = str; printf("\np = %s\n", p); printf("sizeof(p) = %d\n", sizeof(p));//linux 64位系统下,指针的长度是8字节,但是windows 64位系统下,指针的长度是4字节 printf("strlen(p) = %d\n", strlen(p)); func(str); return 0; }
输出为:
str = Hello sizeof(str) = 6 strlen(str) = 5 p = Hello sizeof(p) = 8 strlen(p) = 5 str_arg = Hello sizeof(str_arg) = 8 strlen(str_arg) = 5
题目2(腾讯11年笔试题):
#include <stdio.h> #include <string.h> void func(char str_arg[2]) { printf("\nstr_arg = %s\n", str_arg); printf("sizeof(str_arg) = %d\n", sizeof(str_arg)); printf("strlen(str_arg) = %d\n", strlen(str_arg)); } int main() { char str[] = "Hello"; func(str); return 0; }输出:
str_arg = Hello sizeof(str_arg) = 8 strlen(str_arg) = 5
例子3:静态数组
#include <stdio.h> #include <string.h> int main() { char * str = "Hello"; printf("str = %s\n", str); printf("sizeof(str) = %d\n", sizeof(str)); printf("strlen(str) = %d\n", strlen(str)); char * p = str; printf("\np = %s\n", p); printf("sizeof(p) = %d\n", sizeof(p));//linux 64位系统下,指针的长度是8字节,但是windows 64位系统下,指针的长度是4字节 printf("strlen(p) = %d\n", strlen(p)); return 0; }输出:
str = Hello sizeof(str) = 8 strlen(str) = 5 p = Hello sizeof(p) = 8 strlen(p) = 5
例子4:动态数组
#include <iostream> #include <cstring> using namespace std; int main() { char * str = new char[10]; cout << "str = " << str << endl; cout << "sizeof(str) = " << sizeof(str) << endl; cout << "strlen(str) = " << strlen(str) << endl; cout << endl; str = "Hello"; cout << "str = " << str << endl; cout << "sizeof(str) = " << sizeof(str) << endl; cout << "strlen(str) = " << strlen(str) << endl; return 0; }输出:
str = sizeof(str) = 8 strlen(str) = 0 str = Hello sizeof(str) = 8 strlen(str) = 5
总结:
1. Linux和Windows不同位数的系统指针的长度不同在题目1中可以看到指针的长度是8个字节,本程序是在ubuntu64位系统下面输出的结果。
如果是linux32位系统指针的长度是4个字节,在windows32位和64位系统下指针的长度都是4个字节。
sizeof(p) = 8
sizeof(str_arg) = 8
2.对字符串进行sizeof操作的时候,会把字符串的结束字符'\0'计算进去,进行strlen操作求字符串的长度不把结束字符'\0'计算进去。sizeof返回定义arr数组时,编译器为其分配的数组空间大小,不关心里面存了多少数据。strlen只关心存储的数据内容,不关心空间的大小和类型。
在例子3和例子4中, str是一个指针不是一个数组,所以sizeof(str) = 8;但是strlen(str) = 5;
str = Hello sizeof(str) = 6 strlen(str) = 5
3.题目2中的形参中的str_arg是一个指针,strlen是对该指针指向的字符串进行求长度操作,与那个2没有关系,写成100也是直接对指向的字符串进行求长度。
4.数组作为函数参数传递的时候已经退化为指针了,func函数的参数str_arg只是表示一个指针,sizeof对指针求长度就是该指针变量本身的长度大小。(本系统指针长度为8个字节)
题目1中的p也是一个指针变量,所以sizeof(p) = 8;
具体还可参考:
http://blog.csdn.net/21aspnet/article/details/1539951http://zhidao.baidu.com/link?url=G9BNVvK7_pojawc3RdWvWv_pPZWmb5E1au9XfMVSuKMNk8hGqsfjKQakJc_q1pmQBOHkB0-Tvx-p5mnMSs1kTq http://blog.163.com/pengfeicui@yeah/blog/static/106403250201010793412165/
相关文章推荐
- C++预定义字符函数
- vc++ 读取指定文件夹下所有文件名
- 2、C++
- C++基础篇 -- vector的resize函数和reserve函数
- C语言文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析
- 【C++】【斐波那契】求第几个斐波那契数字。
- RHEL安装 C++ 编译器
- C++有哪几种情况只能用初始化列表,而不能用赋值?
- IOS 学习第七天 C语言 数组
- C/C++文件读写
- C++学习之对象成员指针篇
- C语言中指针与java
- c/c++ 拼接字符串 与函数传参时数组不是传值
- 单例模式的多线程安全支持(C++)
- vs2013 C++ opencv配置
- C++ Map 嵌套
- C++中四种强制类型转换的区别
- 基于Libevent最小根堆定时器的C++定时器实现
- 欢迎使用CSDN-markdown编辑器
- C++ 学习