C/C++几个内存处理函数

C/C++几个内存处理函数

转载:http://blog.csdn.net/hnu_zxc/article/details/7104052

1、memcpy复制内存块

void * memcpy ( void * destination, const void* source, size_t num );

从source指向的位置直接复制num个字节的值到destination指向的内存块。

对于这个函数,source和destination指向的对象的底层类型是无关的;结果是数据的一个二进制复制。这个函数不检查任何结束空字符(null)—— 它总是准确地复制num个字节。为了避免溢出,source和destination两个参数指向的数组的大小应该至少是num字节,并且不应该重叠(对于重叠内存块,memmove是一个更安全的方法))。

参数

Destination:       指向内容被复制到的目的数组的指针,类型被转换为void*。

Source:          指向复制数据的源数组的指针,类型被转换为void*。

Num:            要复制的字节数。

返回值:         返回目的指针destination。

Example:

1.  /* memcpy example */  

2.  #include <stdio.h>  

3.  #include <string.h>  

4.    

5.  int main ()  

6.  {  

7.    char str1[]="Sample string";  

8.    char str2[40];  

9.    char str3[40];  

10.   memcpy (str2,str1,strlen(str1)+1);  //注意此处的strlen(),此处需要+1

11.   memcpy (str3,"copy successful",16);  //长度比字符数多1

12.   printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3);  

13.   return 0;  

14. }  

Output:

1.  str1: Sample string  

2.  str2: Sample string  

3.  str3: copy successful  

2、memmove移动内存块

void * memmove ( void * destination, const void * source,size_t num );

从source指向的位置复制num个字节的值到destination指向的内存块。复制操作的发生就好像使用了中间缓存,允许destinationsource重叠。

对于这个函数,source和destination指向的对象的底层类型是无关的;结果是数据的一个二进制复制。这个函数不检查任何结束空字符(null)—— 它总是准确地复制num个字节。为了避免溢出,source和destination两个参数指向的数组的大小应该至少是num字节。

参数

Destination:       指向内容被复制到的目的数组的指针,类型被转换为void*。

Source:          指向复制数据的源数组的指针,类型被转换为void*。

Num:            要复制的字节数

返回值:         返回目的指针destination。

Example:

1.  /* memmove example */  

2.  #include <stdio.h>  

3.  #include <string.h>  

4.    

5.  int main ()  

6.  {  

7.    char str[] = "memmove can be very useful......";  

8.    memmove (str+20,str+15,11);  

9.    puts (str);  

10.   return 0;  

11. }  

Output:

1.  memmove can be very very useful.  

3、memset填充内存块

void * memset ( void * ptr, int value, size_t num );

将ptr指向的内存块的前num个字节设置为特定的值value(被解释为一个unsigned char类型的值)。

参数

Ptr:          指向需要填充的内存块的指针。

Value:        要设置的值,这个值是作为int型传递的,但是该函数用这个值的unsigned char类型转换值来填充内存块。

Num:        要是指特定值的字节数。

返回值:   返回指针ptr。

Example:

1.  /* memset example */  

2.  #include <stdio.h>  

3.  #include <string.h>  

4.    

5.  int main ()  

6.  {  

7.    char str[] = "almost every programmer should know memset!";  

8.    memset (str,'-',6);  

9.    puts (str);  

10.   return 0;  

11. }  

Output:

1.  ------ every programmer should know memset!  

4、memchr在内存块中定位字符

const void * memchr ( const void * ptr,  int value,  size_t num );

     void * memchr(     void * ptr,  int value,  size_t num );

在ptr指向的内存块的前num个字节中搜索value值得第一次出现(被解释为一个unsigned char类型的值),并返回指向该值的指针。

参数

Ptr:        指向需要被执行搜索的内存块的指针。

Value:       需要被定位的值。这个值是作为int型传递的,但是该函数用这个值的unsigned char类型转换值来进行逐位的搜索。

Num:       要分析的字节数。

返回值:     返回指向ptr指向的内存块中value值第一次出现位置的指针。如果没有找到value值,则该函数返回NULL。

Example:

1.  /* memchr example */  

2.  #include <stdio.h>  

3.  #include <string.h>  

4.    

5.  int main ()  

6.  {  

7.    char * pch;  

8.    char str[] = "Example string";  

9.    pch = (char*) memchr (str, 'p', strlen(str));  

10.   if (pch!=NULL)  

11.     printf ("'p' found at position %d.\n", pch-str+1);  

12.   else  

13.     printf ("'p' not found.\n");  

14.   return 0;  

15. }  

Output:

1.  'p' found at position 5.  

5、memcmp比较两个内存块

int memcmp ( const void * ptr1, const void * ptr2, size_t num);

将ptr2指向的内存块的前num个字节与ptr2指向的内存块的前num个字节进行比较,如果它们都相符合则返回0,反之则返回一个指示其中一个较大的非零值。

参数

ptr1:       指向内存块的指针。

ptr2:       指向内存块的指针

num:       需要比较的字节数。

返回值: 返回一个指示两个内存块的内容间的关系的整型值。

0值表示两个内存块的内容是相等的。一个大于0的值表示,两个内存块中第一个不匹配的字节是ptr1的比ptr2的大,作为unsigned char类型比较的;小于0则表示相反。

Example:

1.  /* memcmp example */  

2.  #include <stdio.h>  

3.  #include <string.h>  

4.    

5.  int main ()  

6.  {  

7.    char str1[256];  

8.    char str2[256];  

9.    int n;  

10.   printf ("Enter a sentence: "); gets(str1);  

11.   printf ("Enter another sentence: "); gets(str2);  

12.   n=memcmp ( str1, str2, 256 );  

13.   if (n>0) printf ("'%s' is greater than '%s'.\n",str1,str2);  

14.   else if (n<0) printf ("'%s' is less than '%s'.\n",str1,str2);  

15.   else printf ("'%s' is the same as '%s'.\n",str1,str2);  

16.   return 0;  

17. }  

Output

1.  Enter a sentence: building  

2.  Enter another sentence: book  

3.  'building' is greater than 'book'.  

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: memset()函数是C/C++语言中的一个库函数,可以用于将一段内存空间的内容设置为指定的值。 memset()函数的原型为: ```c void *memset(void *s, int c, size_t n); ``` 其中,s是指向要设置的内存的指针;c是要设置的值,通常是一个无符号字符或者零;n是要设置的内存空间的大小。 memset()函数的作用是将一段内存空间的每个字节都设置为相同的值。可以用于初始化内存,或者将内存中的内容清零。 使用memset()函数需要注意以下几点: 1. memset()函数只能用于字符数据类型或者无符号整型数据类型,即只能设置1字节大小的值。 2. 使用memset()函数时,需要知道要设置的内存空间的大小,以防止超出边界进行内存越界操作。 3. memset()函数是按字节进行设置的,所以对于非字符类型数据(如整数或浮点数),可能造成数据不符合预期。 示例代码: ```c #include <string.h> int main() { int arr[5]; memset(arr, 0, 5 * sizeof(int)); // 将arr内存空间设置为0 char str[20]; memset(str, 'A', 19); // 将str内存空间设置为'A' str[19] = '\0'; // 末尾添加'\0',形成一个字符串 return 0; } ``` 总之,memset()函数是一个能快速设置内存空间内容的函数,可以方便地进行内存初始化和内存清零操作。 ### 回答2: memset()函数是C语言中的一个库函数,其原型如下: void *memset(void *ptr, int value, size_t num); memset()函数的作用是将指定内存空间的值设置为指定的值。其中,ptr表示要设置的内存空间的起始地址,value表示要设置的值,num表示要设置的字节数。 memset()函数的返回值为void指针类型,即可以接受任何类型的指针。 使用memset()函数可以在一次调用中批量设置内存空间的值,提高效率和代码的简洁度。 例如,下面的代码片段就是使用memset()函数将数组arr中的所有元素设置为0: int arr[10]; memset(arr, 0, sizeof(arr)); 由于memset()函数设置的是字节数据,所以在设置非字符类型数据时需要小心。以一个int型数组arr为例,使用memset()函数将其所有元素设置为-1可能会出现错误。因为在某些机器上,-1的二进制表示并不是所有字节全为1,这会导致memset()函数设置的结果并非预期。 对于字符数组或字符串,可以使用memset()函数设置为0,即'\0',也可以使用strcpy()函数进行单个字符赋值,这样更为安全可靠。 总之,memset()函数是一个实用的函数,可以批量设置内存空间的值,提高代码的执行效率和简洁度。在使用时,需要注意数据类型和数据源的合法性,以避免出现错误。 ### 回答3: memset()函数是C/C++语言中的一个库函数,主要用来对一段指定内存空间进行初始化。 其函数原型为: void* memset(void* ptr, int value, size_t num); 第一个参数ptr是一个指向某一块内存区域的指针,用来指定待初始化的内存空间。 第二个参数value是一个整数值,用来指定待初始化的值,其中最常用的是0。 第三个参数num是一个整数值,用来指定待初始化的内存空间的字节数。 memset()函数的作用是将ptr指向的内存空间中的每个字节都设置为value指定的值。一般来说,value为0时,可以用来将内存空间清零。 memset()函数通常用于对数组、字符串或结构体等数据类型的初始化。例如,当我们声明一个数组或字符串后,需要将其所有元素或字符都初始化为0,可以使用memset()函数。 以下是一个使用memset()函数进行数组初始化的示例: int num[5]; memset(num, 0, sizeof(num)); 以上代码将会把num数组的所有元素都初始化为0。 需要注意的是,memset()函数只能用来设置每个字节的值,并不能对较大的数据块进行初始化。此外,在使用memset()函数时,需要确保待初始化的内存空间不受限制并且是可访问的,否则可能会引发错误。 总结起来,memset()函数是C/C++中常用的一个函数,主要用来对一段指定的内存空间进行初始化,提高程序的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值