指针、内存操作中的一些其它注意点

来源:互联网 发布:movo润滑液 知乎 编辑:程序博客网 时间:2024/04/28 21:36
指针、内存操作中的一些其它注意点


    (1) 如下例子:
          int  *a = 0;  表达式*a 等于多少?a是一个NULL指针,对它解引用是错误的。
          但有些环境不会在运行时捕捉到这个错误,而是去访问内存位置0的内容,这是
          一个隐患。所以,在解引用之前必须先对指针进行有效性检查。       


  内存操作函数:
    void *memcpy( void *dst, void const *src, size_t length );
    void *memmove( void *dst, void const *src, size_t length );
    void *memcmp( void const *a, void const *b, size_t length );
    void *memchr( void const *a, int ch, size_t length );
    void *memset( void *a, int ch, size_t length );
    以上函数直接对内存操作,以字节数为单位。其中,memcpy能处理任意字节的序列,比如将一段内存中的序列读入一个结构体中;而strcpy()只处理字符序列,且遇NUL字节即结束。
   memmove与memcpy的唯一区别是:memmove允许源和目标操作数重叠,memcpy不允许。
   memchr从a的起始位置开始查找字符ch第一次出现的位置。


  动态分配内存(stdlib.h中):
  void *malloc( size_t size );  分配失败返回NULL,所以要作判断。
  void free( void *pointer );  pointer是malloc,calloc,realloc返回值,也可为NULL。动态分配的内存必须整块一起释放。
  void *calloc( sizes_t num_elements, size_t element_size ); 与malloc区别在于:calloc将分配的内存初始化为0。
  void realloc( void *ptr, size_t new_size ); 修改一个原先已经分配好的内存块的大小(长则不足,短则切割,若原先内存块无法改变大小,则分配另一块内存并返回指向它的指针,所以旧的指针就不能再用了)。若ptr为NULL,则和malloc无异了。返回类型为void*,可以赋给任意类型的指针。
原创粉丝点击