sizeof strlen strncpy用法总结 结构体实际所占内存大小 以及memset用法
sizeof测类型(数组名除外) strlen测实际长度 strncpy返回指针类型
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *p="wangddd";
printf("%d\n",sizeof(p));//输出4,指针类型 char x[];
printf("%d\n",sizeof(x));//输出8,所占内存数。注意此处是8*1得出的8,若是int型数组则为8*4得32 printf("%s\n",strncpy(x,"wangddddd",sizeof(x)));//返回x指针,只能正常显示前7位,给x赋值时没有自动加上\0,
//strncpy返回值是一个指针x
printf("%d\n",sizeof(strncpy(x,"wangddddd",sizeof(x))));//输出4
printf("%d\n",strlen(strncpy(x,"jskjksjdf",sizeof(x))));//随机 取决于编译环境
printf("%d\n",strlen(strncpy(x,"jskjkse",sizeof(x))));//输出7,第8位正好是\0 char y[]="w c";
printf("%d\n",strlen(y));//输出3
printf("%d\n",sizeof(y));//输出5 return ;
}
特殊之处:1 数组名不是指针,但神似指针,因为sizeof(X)打印的是8。具体的解释转载自:http://blog.chinaunix.net/uid-21765995-id-1815661.html
2 sizeof可以如下使用:
第一种用法:
#include <iostream>
using namespace std; int main(int argc, char* argv[])
{
int i=;
cout<<sizeof(i)<<<<sizeof()<<sizeof <<endl;// sizeof(变量名) sizeof(常量名) sizeof 常量 都是可以的,但为了保持规范一般不写第三种
return ;
}
第二种用法:
#include <iostream>
using namespace std; int sum(int a,int b)
{
cout<<a+b<<endl;
return a+b;
} int main(int argc, char* argv[])
{
int i=;
cout<<sizeof(sum(,))<<endl;
return ;
} 结果为:4
说明:仅打印了sum函数返回值的类型的大小,并没有调用函数。若sum无返回值则编译提示错误。
函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:
sizeof( sun );// error
void foo2() { }
sizeof( foo2() );// error
struct S
{
unsigned int f1 : ;
unsigned int f2 : ;
unsigned int f3 : ;
};
sizeof( S.f1 );// error
对于结构中变量不能被sizeof计算是由于
让我们交换一下S1中char与int的位置:
struct S2
{
int i;
char c;
};
看看sizeof(S2)的结果为多少,怎么还是8再看看内存,原来成员c后面仍然有3个填充字节,这又是为什么啊别着急,下面总结规律。
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)
struct S3
{
char c1;
S1 s;
char c2;
};
S1的最宽简单成员的类型为int,S3在考虑最宽简单类型成员时是将S1“打散”看的,所以S3的最宽简单类型为int,这样,通过S3定义的变量,其存储空间首地址需要被4整除,整个sizeof(S3)的值也应该被4整除。 c1的偏移量为0,s的偏移量呢这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间就不需要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补上3个填充字节。最后得到sizeof(S3)的值为16。
结构体的大小等于最后一个成员的偏移量加上其大小再加上末尾的填充字节数目,即:
“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。如下:
struct S5 { };
sizeof( S5 ); // 结果为1
#include <stdio.h>
struct student
{
long id; //4字节 char name[]; //10字节 char sex; //1字节 int age; //4字节 float score; //4字节 };
// 4+10+1+1+4+4 int main()
{
struct student one; printf("%d", sizeof(struct student));
}
这是我在QQ群里见到有人问的一道问题,结果为24,我说下自己的分析,若有不对还请高手指点,不胜感激。该结构体中最大的基本数据类型为4个字节(数组不是基本类型,被打散着看),所以该结构体的首地址为4的整数倍,id的偏移量为0,因为数组是一个整体,根据数组的sizeof可知其为10个字节,偏移量为sizeof(char)的整数倍,所以char[]的偏移量为4(id决定),sex的偏移量也是sizeof(char)的整数倍,此时总共占了4++=15个字节,age的偏移量需要是sizeof(int)的整数倍,所以需要在sex后补上一个填充字节,所以age偏移量为16,score的偏移量为16+=(可以被4整除),在算上score的4个字节,为24,可以被结构体的最宽基本字节整除,所以整个结构体的sizeof(struct student)为24
对于参数中的数组类型,sizeof计算首地址时认为是指针:
void foo3(char a3[])
{
int c3 = sizeof( a3 ); // c3 ==
}
void foo4(char a4[])
{
int c4 = sizeof( a4 ); // c4 ==
}
也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=。这里函数参数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗不会!数组是“传址”的,调用者只需将实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。
例1:一个int
a[]型变量,则memset(a,,sizeof(int))此操作后,元素a[]的每个字节的值都是100,即0x64,二进制表示:
,所以元素a[]为0x64646464,二进制表示:
void main()
{ int i,a[];
memset(a,,*sizeof(int));
for(i=;i<;i++)
cout< 此函数输出的10个元素并非10,而是每个字节都是00001010组成的int型数。
例2:
#include
#include
void main( void )
{
char buffer[] = "This is a test of the memset function";
printf( "Before: %s\n", buffer );
memset( buffer, '*', );
printf( "After: %s\n", buffer );
}
Output
Before: This is a test of the memset function
After: **** is a test of the memset function Memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为' '或'\0';
例:char a[];
memset(a, '\0', sizeof(a));
memset可以方便地清空一个结构体类型的变量或数组。
如:
struct sample_struct
{
char csName[];
int iSeq;
int iType;
};
对于变量
struct sample_strcut stTest;
一般情况下,清空stTest的方法:
stTest.csName[]='\0';
stTest.iSeq=;
stTest.iType=;
用memset就非常方便:
memset(&stTest,,sizeof(struct sample_struct));
如果是数组:
struct sample_struct TEST[];
则
memset(TEST,,sizeof(struct sample_struct)*);
sizeof strlen strncpy用法总结 结构体实际所占内存大小 以及memset用法的更多相关文章
- NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构
本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...
- C结构体中数据的内存对齐问题
转自:http://www.cnblogs.com/qwcbeyond/archive/2012/05/08/2490897.html 32位机一般默认4字节对齐(32位机机器字长4字节),64位机一 ...
- [C++关键字] alignof & alignas 内存对齐 sizeof 占内存大小
直接上代码测试是入门神器,以结构体为例,解释“对齐”和“补齐”概念. #include <iostream> struct Empty {}; struct Foo { int f2; d ...
- .NET C#基础(5):结构体 - 高性能代码的基石
0. 文章目的 本文面向有一定.NET C#基础知识的学习者,介绍C#中结构体定义.使用以及特点. 1. 阅读基础 了解C#基本语法 了解.NET中的栈与托管堆 2. 值类型 2.1 .N ...
- 【 转】 C/C++结构体和联合体的区别
联合体用途:使几个不同类型的变量共占一段内存(相互覆盖) 结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-------自定义数据类型 总结: 声明一个联合体: union abc { i ...
- 结构体(struct)
结构体 结构体是将不同类型的数据按照一定的功能需求进行整体封装,封装的数据类型与大小均可以由用户指定. 1 结构体的声明.定义及初始化 1.1 声明结构体类型 struct 结构体名 { 成员列表: ...
- 漫谈C语言结构体
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
- 漫谈C语言结构体【转】
相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...
- C语言 结构体作为函数的参数
1)使用结构体变量作为函数的参数 使用结构体变量作为函数的实参时,采用的是值传递,会将结构体变量所占内存单元的内容全部顺序传递给形参,形参必须是同类型的结构体变量 demo: # include &l ...
随机推荐
- URAL1029. Ministry(DP+路径)
链接 路径麻烦啊 很多细节 倒回去搜一遍 卡了一节数据库.. #include <iostream> #include<cstdio> #include<cstring& ...
- poj1988
知道了并查集写的问题后,我也明白了为什么之前这道题TLE的原因: 有这道题的合并操作不难想到用并查集维护: 由于并查集易于向上查询而不易于向下查询 所以对于询问方块x下面有多少个方块,我们可以转化为立 ...
- POJ 2513 Colored Sticks 解题报告
第一次接触欧拉回路.虽然在离散数学里学过,敲代码还是第一次. 本题是说端点颜色相同的两根木棒可连接,能否将所有的木棒连成一条直线. 将颜色视为节点v,将木棒视为边e,构成图G.如果能找到一条一笔画的路 ...
- XHTML代码规则&手工html转换xhtml
XHTML规则 XHTML是XML得一个应用,它遵守XML得规范和要求.从技术角度上讲.这些语法规则是由XML规范定义的. XML文档必须遵守的规则使得生成工具以解析文档变得更容易.这些规则也使得XM ...
- ESB、SOA、EAI异同【转】
先说概念: ESB:企业服务总线(ESB : Enterprise Service Bus):ESB 是一种开放的.基于标准的分布式同步或异步信息传递中间件.通过 XML.Web Serv ...
- qosort 使用使用小例子
输入 1500 3150 300100 200 输出结果470 471100 200150 300470 471 #include <iostream> #inc ...
- HDOJ-ACM1016(JAVA) 字典序全排列,并剪枝
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5576273.html 题意: 一个环是用图中所示的n个圆组成的.把自然数1.2.…….n分别放入每个圆中,并在相邻 ...
- java nio 快速read大文件
If you want to make your first example faster FileChannel inChannel = new FileInputStream(fileName). ...
- [MySQL]快速解决"is marked as crashed and should be repaired"故障
具体报错如下: Table '.\Tablename\posts' is marked as crashed and should be repaired 提示说论坛的帖子表posts被标记有问题,需 ...
- MongoDB 入门之查询(find)
MongoDB 入门之查询(find) 1. find 简介 (1)find的第一个参数决定了要返回哪些文档. 空的查询文档会匹配集合的全部内容.默认就是{}.结果将批量返回集合c中的所有文档. db ...