先看一段测试程序
#include "stdafx.h" #include <malloc.h> #include <string.h>
int main(int argc, char* argv[]) { char *a=(char *)calloc(4,sizeof(char)); char *b=(char *)malloc(4*sizeof(char));
int *d=(int *)calloc(1,sizeof(int)); char *c=(char *)malloc(sizeof(char));
int nc=sizeof(c); //4
int nd=sizeof(d); //4
int na=sizeof(a)*4; //16
int nb=sizeof(b); //4
int sa=strlen(a); //0
int sb=strlen(b); //4 有可能,还可能是其它,比如本次实验就是9
memcpy(a,"ab",2); memcpy(b,"ab",2); int sa1=strlen(a); //2
int sb1=strlen(b); //4 有可能,还可能是其它,比如本次实验就是9
char str1[5],str2[5]; memset(str1,0,sizeof(str1)); int ns1=strlen(str1); //0
int nl1=sizeof(str1); //5
memcpy(str1,"ab",2); int ns11=strlen(str1); //2
int nl22=sizeof(str1); //5
printf("Hello World!\n"); return 0; } |
原型:extern void *calloc(int num_elems, int elem_size);
用法:#include
功能:为具有num_elems个长度为elem_size元素的数组分配内存,分配时把所分配的内存置为0,所以上例中字符串长度是0;
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
原型:extern void *malloc(unsigned int num_bytes);
用法:#include
功能:分配长度为num_bytes字节的内存块,不清空,所以字符串长度不为0
说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
原型:extern int strlen(char *s);
用法:#include
功能:计算字符串s的长度,遇到\0则返回,需注意
说明:返回s的长度,不包括结束符NULL。
原型:extern char *strstr(char *haystack, char *needle);
用法:#include
功能:从字符串haystack中寻找needle第一次出现的位置(不比较结束符NULL)。
说明:返回指向第一次出现needle位置的指针,如果没找到则返回NULL。如寻找“ABC”,则返回‘A’的地址;
sizeof:首先,sizeof不是函数,返回一个对象后者类型所占的内存空间,用法有
1、sizeof(object):对象使用object,可以写成sizeof object,如int n;sizeof n;或者sizeof(i)都一样
2、sizeof(typename):类型使用,可以用sizeof(typename),如sizeof(int),可见,使用sizeof()永远是正确的。
也可以对函数使用,如sizeof(a()),返回函数a()的返回值所占空间。
1、sizeof与strlen
- char *ss="123456";
-
sizeof(ss)=4;/*ss为字符串指针,是一个地址*/
-
sizeof(*ss)=1;/* *ss是第一个字符*/
-
-
char ss[]="123456";
-
sizeof(ss)=7;/*ss是数组,空间已分配好,该数组所占7个字节,字符串最后还有\0;有本书上说计算到\0,错了,是计算出整个数组所占内存大小*/
-
sizeof(*ss)=1;/* *ss是第一个字符*/
-
-
char ss[100]="123456";
-
sizeof(ss)=100;/*ss表在内存中预分配的大小 1X100*/示
-
strlen(ss)=6;/*计算字符串长度,遇到\0停止*/
2、内存中的数据对齐
- #pragma pack(4)
-
struct a{
-
char b;
-
int c;
-
char d;
-
}a;
-
#pragma
-
sizeof(a)=12;/*上述内存分配以4字对齐,即结构体里面每一个数据类型的首地址必须是4的倍数,b地址假如是0,好符合,后面占一个字节,下一个是1分配给c就不符合,所以后面3个字节的内存空间不使用从4地址开始分配c,占4个字节,后面一个字节给d,后面3个字节空起,如下图所示:
-
|b---| c |d---|共12个字节*/
- pack(4)用来指明那种对齐方式,可以是1、2、4、8、16,若改成pack(1),则sizeof(a)=6,最好使用处理器默认的对齐方式,这样才能达到CPU的最好性能。
阅读(2641) | 评论(0) | 转发(0) |