Chinaunix首页 | 论坛 | 博客
  • 博客访问: 376895
  • 博文数量: 57
  • 博客积分: 2299
  • 博客等级: 大尉
  • 技术积分: 1109
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-27 23:12
文章分类
文章存档

2011年(4)

2010年(53)

分类: C/C++

2010-08-05 13:56:50

先看一段测试程序

#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

  1. char *ss="123456";
  2. sizeof(ss)=4;/*ss为字符串指针,是一个地址*/
  3. sizeof(*ss)=1;/* *ss是第一个字符*/

  4. char ss[]="123456";
  5. sizeof(ss)=7;/*ss是数组,空间已分配好,该数组所占7个字节,字符串最后还有\0;有本书上说计算到\0,错了,是计算出整个数组所占内存大小*/
  6. sizeof(*ss)=1;/* *ss是第一个字符*/

  7. char ss[100]="123456";
  8. sizeof(ss)=100;/*ss表在内存中预分配的大小 1X100*/
  9. strlen(ss)=6;/*计算字符串长度,遇到\0停止*/

2、内存中的数据对齐
  1. #pragma pack(4)
  2.      struct a{
  3.          char b;
  4.          int c;
  5.          char d;
  6.      }a;
  7. #pragma
  8. sizeof(a)=12;/*上述内存分配以4字对齐,即结构体里面每一个数据类型的首地址必须是4的倍数,b地址假如是0,好符合,后面占一个字节,下一个是1分配给c就不符合,所以后面3个字节的内存空间不使用从4地址开始分配c,占4个字节,后面一个字节给d,后面3个字节空起,如下图所示:
  9. |b---| c |d---|共12个字节*/
  10. pack(4)用来指明那种对齐方式,可以是1、2、4、8、16,若改成pack(1),则sizeof(a)=6,最好使用处理器默认的对齐方式,这样才能达到CPU的最好性能。

阅读(2593) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~