【问题标题】:My memcpy function prints the src twice unexpectedly我的 memcpy 函数意外打印 src 两次
【发布时间】:2020-12-26 22:17:53
【问题描述】:

https://onlinegdb.com/B1OmLVB6D

我不确定为什么在运行 memcpyByByte 函数后 src 变量会打印两次。

int memcpyByByte(void* src, void* dest, size_t len) {
    char* srcC = (char*)src;
    char* destC = (char*)dest;
    
    for(int i = 0; i< len; i++){
        *(destC+i) = *(srcC+i);
    }
}

int main()
{
    char a[10] = "1234567890";
    char b[10] = "6b";

    memcpyByByte(&a, &b, sizeof(a));

    printf("src:  %s\n", a);
    printf("dest: %s", b);

    return 0;
}

【问题讨论】:

  • a 对于空终止符来说不够大,因此程序具有未定义的行为。
  • 这要么是读取无效内存地址的未定义行为,要么是写入无效内存地址的未定义行为。

标签: c memcpy


【解决方案1】:

C 字符串的末尾有一个隐含的终止字节,值为 0 (NULL)。 字符串"1234567890"的大小是11,不是10。

将其分配给 10 元素长数组将导致终止符丢失。因此printf()会在a之后继续扫描内存,可能打印b的内容。

只需将ab 的大小更改为11。或者让编译器确定大小:

char a[] = "1234567890";
char b[sizeof a] = "6g";

【讨论】:

  • 将 11 个(甚至 10 个)字符复制到只有 3 个字符的内存块中究竟是一种确定性操作?
  • @goodvibration: sizeof b 是 10,而不是 3,但它仍然太小,无法容纳 11 个字节。
猜你喜欢
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
相关资源
最近更新 更多