memcpy,memcpy_s

电脑杂谈  发布时间:2020-04-03 11:05:36  来源:网络整理

sprintf strcpy memcpy_memcpy函数_memcpy

2)与(1)相同,除了在发生错误时清除整个目标范围[dest,dest + destsz)(如果dest和destsz均合法),它在运行时检测到以下错误并调用当前安装的约束处理功能:

如果dest指向的字符数组的大小为memcpy,则行为未定义;换句话说memcpy,不正确的destsz值不会暴露可能在该行上发生的缓冲区溢出.

与所有边界检查功能一样,仅当memcpy_s的实现定义__STDC_LIB_EXT1__并且用户在包含string.h之前将__STDC_WANT_LIB_EXT1__定义为整数常量1时,才能保证其可用.

目的地

指向要复制的对象的指针

memcpy_sprintf strcpy memcpy_memcpy函数

destsz

目标中要修改的最大字节数(通常是目标对象的大小)

src

用于复制源对象的指针

计数

sprintf strcpy memcpy_memcpy_memcpy函数

复制的字节数

1)返回dest的副本,该副本本质上是低级操作的临时内存地址. 不建议在实际操作中直接使用此地址. 操作完成后,真正有意义的地址就是目的本身.

2)成功返回零,错误返回非零. 错误时,如果dest不是空指针并且destsz有效,则destsz零字节也会写入目标数组.

memcpy可用于设置分配函数获得的对象.

memcpy是最快的内存到内存复制例程. 通常,它比strcpy效率更高,strcpy必须扫描其复制的数据或记忆,而必须避免处理重叠的输入.

memcpy函数_sprintf strcpy memcpy_memcpy

许多C编译器将合适的内存复制循环转换为memcpy调用.

Memcpy可用于转换值,其中禁止检查同一内存的两种不同类型的值.

运行此代码

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
#include <stdlib.h>
 
int main(void)
{
    // 简单用法
    char source[] = "once upon a midnight dreary...", dest[4];
    memcpy(dest, source, sizeof dest);
    for(size_t n = 0; n < sizeof dest; ++n)
        putchar(dest[n]);
 
    // 设置分配的内存的有效类型为 int
    int *p = malloc(3*sizeof(int));   // 分配的内存无有效类型
    int arr[3] = {1,2,3};
    memcpy(p,arr,3*sizeof(int));      // 分配的内存现在拥有有效类型
 
    // reinterpreting data
    double d = 0.1;
//    int64_t n = *(int64_t*)(&d); // 严格别名使用违规
    int64_t n;
    memcpy(&n, &d, sizeof d); // OK
    printf("\n%a is %" PRIx64 " as an int64_t\n", d, n);
 
#ifdef __STDC_LIB_EXT1__
    set_constraint_handler_s(ignore_handler_s);
    char src[] = "aaaaaaaaaa";
    char dst[] = "xyxyxyxyxy";
    int r = memcpy_s(dst,sizeof dst,src,5);
    printf("dst = \"%s\", r = %d\n", dst,r);
    r = memcpy_s(dst,5,src,10);            // count 大于 destsz  
    printf("dst = \"");
    for(size_t ndx=0; ndx<sizeof dst; ++ndx) {
        char c = dst[ndx];
        c ? printf("%c", c) : printf("\\0");
    }
    printf("\", r = %d\n", r);
#endif
}

可能的输出:

sprintf strcpy memcpy_memcpy_memcpy函数

once
0x1.999999999999ap-4 is 3fb999999999999a as an int64_t
dst = "aaaaayxyxy", r = 0
dst = "\0\0\0\0\0yxyxy", r = 22

将一个缓冲区移到另一个缓冲区

(功能)[编辑]

在两个不重叠的数组之间复制一定数量的宽字符

(功能)[编辑]


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-162364-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...