memccpy 如何处理大整数值?

sth*_*55 3 c c-standard-library

根据man 3 memccpy函数memccpy定义如下:

概要

#include <string.h>

void *memccpy(void *dest, const void *src, int c, size_t n);
Run Code Online (Sandbox Code Playgroud)

描述

memccpy()函数将不超过n字节的内存区域复制src到内存区域,并在找到dest字符时停止。c

如果内存区域重叠,则结果不确定。

让我困惑的是memccpy复制字节并在找到字符n时停止。但是,该函数需要作为参数。那么如果我使用以下值调用会发生什么: cint cmemccpy

memccpy(&x, &y, 0xffffff76, 100);
Run Code Online (Sandbox Code Playgroud)

这里要检查的值对于 来说太大了char。这个案子应该有效吗?

Mar*_*lli 6

memccpy()由 POSIX.1-2001 ( IEEE Std 1003.1-2001 )定义,其中规定:

概要

#include <string.h>

void *memccpy(void *restrict s1, const void *restrict s2,
       int c, size_t n);
Run Code Online (Sandbox Code Playgroud)

描述

memccpy()函数应将字节从内存区域复制s2s1,在复制第一次出现的字节c转换为 unsigned char)后停止,或在复制 n 个字节后停止,以先到者为准。如果复制发生在重叠的对象之间,则行为未定义。

就这样,一个简单的unsigned char转换发生了:

#include <string.h>

void *memccpy(void *restrict s1, const void *restrict s2,
       int c, size_t n);
Run Code Online (Sandbox Code Playgroud)

事实上,据我所知,最著名的 C 标准库实现正是这样做的:

  • GNU libc:传递给memchrunsigned char c = (unsigned int)c_in;
  • BSD 库unsigned char uc = c;
  • Bionic (Android):借自 BSDunsigned char uc = c;
  • musl libc:通过强制转换重新分配c = (unsigned char)c;
  • uClibc:比较时进行转换:(((unsigned char)(*r1++ = *r2++)) != ((unsigned char) c))