内存复制与填充

基本类型 / 指针

void printArray(const char *name, const int arr[], size_t count) {
    printf("%s is {", name);
    for (size_t i = 0; i < count; i++) {
        if (i > 0) {
            printf(", ");
        }
        printf("%d", arr[i]);
    }
    printf("}\n");
}

int source[] = {1, 2, 3, 4, 5};
int copy[5];

//= does not copy arrays: memcpy copies bytes,
//so the size is count * element size
memcpy(copy, source, sizeof source);
//copy is {1, 2, 3, 4, 5}
printArray("copy", copy, 5);

//the ranges overlap: memmove shifts right by one, memcpy may spoil it
memmove(source + 1, source, 4 * sizeof source[0]);
//source is {1, 1, 2, 3, 4}
printArray("source", source, 5);

//memset fills bytes: good for zeros
int zeros[5];
memset(zeros, 0, sizeof zeros);
//zeros is {0, 0, 0, 0, 0}
printArray("zeros", zeros, 5);

//but not for other numbers: every byte of an int becomes 1
int ones[3];
memset(ones, 1, sizeof ones);
//ones is {16843009, 16843009, 16843009}
printArray("ones", ones, 3);

//a char is one byte, so text is filled as expected
char line[6];
memset(line, '-', 5);
line[5] = '\0';
//line is "-----"

//memcmp compares bytes, 0 means equal
bool same = memcmp(copy, source, sizeof copy) == 0;
//same is false

printf("line is %s\n", line);
printf("same is %s\n", same ? "true" : "false");