C++语言cstring库之memcpy与memcpy_s


C++语言cstring库之memcpy与memcpy_s:

// void *memcpy(void *dest, const void *src, size_t count); 
// errno_t memcpy_s(void *dest, size_t numberOfElements, const void *src, size_t count); 
 
void test_memcpy_string() 

    char *s = "Golden Global View"; 
    char d1[19], d2[10], d3[19], d4[10]; 
 
    // 1. sizeof(dest) >= sizeof(src) + 1时 
    memcpy(d1, s, strlen(s)); 
    d1[strlen(s)] = 0; 
    std::cout << "d1: " << d1 << std::endl; 
 
    // 2. sizeof(dest) < sizeof(src) + 1时 
    // memcpy(d2, s, strlen(s));    // 会出错, 这也是memcpy不安全的原因 
    // d2[strlen(s)] = 0; 
    memcpy(d2, s, sizeof(d2) - 1); 
    d2[sizeof(d2) - 1] = 0; 
    std::cout << "d2: " << d2 << std::endl; 
 
    // 3. 使用memcpy_s代替memcpy, sizeof(dest) >= sizeof(src) + 1时 
    errno_t err1 = memcpy_s(d3, sizeof(d3), s, strlen(s)); 
    d3[strlen(s)] = 0; 
    std::cout << "d3: " << d3 << std::endl; 
 
    // 4.  使用memcpy_s代替memcpy, sizeof(dest) < sizeof(src) + 1时 
    errno_t err2 = memcpy_s(d4, sizeof(d4), s, sizeof(d4) * sizeof(char)); 
    d4[sizeof(d4) - 1] = '\0'; 
    std::cout << "d4: " << d4 << std::endl; 

 
void test_memcpy_struct() 

    struct { 
        char name[13]; 
        int age; 
    } person, person_copy; 
 
    // myname有16个字符. 
    char* myname = "Pierre de Fermat"; 
 
    // 复制字符串 
    std::cout << sizeof(person.name) << std::endl; 
    std::cout << sizeof(person) << std::endl; 
    std::cout << strlen(myname) << std::endl; 
 
    memcpy(person.name, myname, strlen(myname)); 
    person.age = 46; 
    std::cout << person.name << std::endl; 
 
    // 复制结构体 
    memcpy(&person_copy, &person, sizeof(person)); 
    printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age); 

相关内容