sizeof strlen 详解

详解sizeof和strlen

1 说明sizeof和strlen之间的区别
(1)sizeof操作符的结果类型是size_t,它在头文件中的typedef为unsinged int类型。该类型保证     能容纳实现所建立的最大对象的字节大小。

(2)sizeof是算符,strlen是函数。

(3)sizeof可以用类型作参数,sizeof还可以用函数作参数。

strlen只能用char*作参数,且必须是以‘\0‘结尾的。比如:

short f();

printf("%d\n",sizeof(f()));

输出的结果是sizeof(short),即2。

(4)数组作sizeof的参数不退化,传递给strlen就退化为指针。

(5)大部分编译器在编译的时候就把sizeof计算过了,是类型或是变量的长度。这就是sizeof(x)可以   用来定义数组维数的原因:

char str[20] = "0123456789";

int a = strlen(str);   //a = 10

int b = sizeof(str);   //而b=20

(6)strlen的结果要在运行的时候才能计算出来。用来计算字符串的长度,而不是类型占用内存的大小。(7)sizeof后如果是类型必须加括号,如果是变量名可以不加括号,这是因为sizeof是个操作符而不是个函数。

(8)当使用了一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。sizeof操作符不能返回被动态分配的数组或外部的数组的尺寸。

(9) 数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:fun(char[8])、fun(char[])都等价于 fun(char*)。在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。如果在函数内知道数组的大小,需要这样做:进入函数后用memcpy将数组拷贝出来,长度由另一个形参传进去。代码如下:

fun(unsigned char*p1, int len){

unsigned char *buf = new unsignedchar[len+1];

memcpy(buf, p1, len);}

(10)计算结构变量的大小就必须讨论数据对齐问题。为了使CPU存取的首都最快(这同CPU取数操作有关,详细的介绍可以参考计算机组成原理)C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但在理论上CPU速度快了。当然,这样的设置会在读写一些别的应用程序生成的数据文件或交换数据时带来不便。MS VC++中的对齐设定,有时候sizeof得到的实际不等。一般在VC++中加上#program pack(n)的设定即可。或者如果要按字节存储,而不进行数据对齐,可以在Options对话框中修改Advanced Compiler选项卡中的"Data Alginment"为按字节对齐。

(11)sizeof操作符不能用于函数类型、不完全类型或位字段。不完全类型指具有位置存储大小数据的数据类型嗯,如未知存储大小的数组类型嗯,未知内容的结构或联合类型,void类型等。

2.一些例子

(1)

char*ss ="0123456789";

sizeof(ss)为4,ss是指向字符串常量的字符指针

strlen(*ss)为1,*ss是第一个字符

(2)

charss[] = "0123456789";

sizeof(ss)为11,ss是数组,计算到‘\0‘的位置,因此是(10+1)

sizeof(*ss)为1,*ss是第一个字符

(3)

char ss[100] ="0123456789";

sizeof(ss)为100,ss表示在内存中预分配的大小,100*1。

strlen(ss)为10, 它的内部实现是用一个循环计算字符串的长度,直到‘\0‘为

(4)

intss[100]="0123456789";

sizeof(ss)为400,ss表示在内存中的大小,100*4。

strlen(ss)错误,strlen的参数只能是char*,且必须是以‘\0‘结尾的。

(5)

classX

{

int i;

int j;

char k;

};

X x;

cout<<sizeof(X)<<endl; //结果为12, 内存补齐

cout<<sizeof(x)<<endl; //结果为12

3.说明sizeof的使用场合

(1)sizeof操作符的一个主要用途是与存储分配和I/0系统那样的例程进行通信。例如:

void *malloc(size_t size);

size_t fread(void *ptr, size_t size,size_t nmemb, FILE *stream);

(2)用它可以看看某种类型的对象在内存中所占的单元字节。例如:

void *memset(void *s, int c,sizeof(s))

(3)在动态分配一个对象时,可以让系统知道要分配多少内存。

(4)便于一些类型的扩充。在windows中有很多结构类型就有一个专用的字段用来存放该类型的字节大小

(5)由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof代替常量计算。

(6)如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

时间: 2024-10-12 04:01:47

sizeof strlen 详解的相关文章

c/c++ sizeof运算符详解以及对象大小

原文:http://krystism.is-programmer.com/posts/41468.html 学过c的都知道sizeof运算符.不过还是需要注意以下几点.先从c的sizeof说起: 1. sizeof 是运算符,而不是函数.虽然我们习惯sizeof(...),但( )并不是必需的,它只是表示优先级.我们把sizeof后面的目标叫对象或者操作数.本文约定就叫sizeof对象. 2. 当sizeof 的对象是表达式时,求的大小是表达式返回值的类型大小,但并不计算表达式的值,比如 ? 1

sizeof函数详解

原文链接http://blog.csdn.net/wzy198852/article/details/7246836 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下.但当我总结的时候才发现,这个问题既可以简单,又可以复杂,所以本文有的地方并不适合初学者,甚至都没有必要大作文章.但如果你想“知其然,更知其所以然”的话,那么这篇文章对你或许有所帮助.菜鸟我对C++的掌握尚未深入,其中不乏错误,欢迎各

C语言 sizeof函数详解

1. 定义:sizeof是何方神圣sizeof乃C/C++中的一个操作符(operator)是也,简单的说其作用就是返回一个对象或者类型所占的内存字节数.MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with avariable or a type (including aggregate types). This keyword returns a value of type siz

sizeof详解

sizeof.cpp #include<iostream> #include <stdio.h> #include <string.h> using namespace  std; struct { short a1; short a2; short a3; }A; struct { long a1; short a2; }B; class D { }; class A2 { char d,e; }; struct E { }; struct C { char b,c;

linux网络编程之shutdown() 与 close()函数详解

linux网络编程之shutdown() 与 close()函数详解 参考TCPIP网络编程和UNP: shutdown函数不能关闭套接字,只能关闭输入和输出流,然后发送EOF,假设套接字为A,那么这个函数会关闭所有和A相关的套接字,包括复制的:而close能直接关闭套接字. 1.close()函数 [cpp] view plain copy print? <span style="font-size:13px;">#include<unistd.h> int 

Linux 网络编程三(socket代码详解)

//网络编程客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>//htons()函数头文件 #include <ne

Android逆向之旅---SO(ELF)文件格式详解

第一.前言 从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域.作为一名Android开发者,每个人都想去探索这个领域,因为一旦你破解了别人的内容,成就感肯定爆棚,不过相反的是,我们不仅要研究破解之道,也要研究加密之道,因为加密和破解是相生相克的.但是我们在破解的过程中可能最头疼的是native层,也就是so文件的破解.所以我们先来详细了解一下so文件的内容下面就来看看我们今天所要介绍的内容.今天我们先来介绍一下elf文件的

(转)Linux IO模式及 select、poll、epoll详解

本文为转载,并作了部门调整.修改. [原文出处:https://segmentfault.com/a/1190000003063859] 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念: 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚

使用 /proc 文件系统来访问 linux操作系统 内核的内容 &amp;&amp; 虚拟文件系统vfs及proc详解

http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/20130422/366044.html 使用 /proc 文件系统来访问 Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口 简介: /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux? 内核空间和用户空间之间进行通信.在 /proc 文件系统中,