sth*_*55 3 c c-standard-library
根据man 3 memccpy函数memccpy定义如下:
概要
Run Code Online (Sandbox Code Playgroud)#include <string.h> void *memccpy(void *dest, const void *src, int c, size_t n);描述
该
memccpy()函数将不超过n字节的内存区域复制src到内存区域,并在找到dest字符时停止。c如果内存区域重叠,则结果不确定。
让我困惑的是memccpy复制字节并在找到字符n时停止。但是,该函数需要作为参数。那么如果我使用以下值调用会发生什么: cint cmemccpy
memccpy(&x, &y, 0xffffff76, 100);
Run Code Online (Sandbox Code Playgroud)
这里要检查的值对于 来说太大了char。这个案子应该有效吗?
memccpy()由 POSIX.1-2001 ( IEEE Std 1003.1-2001 )定义,其中规定:
概要
Run Code Online (Sandbox Code Playgroud)#include <string.h> void *memccpy(void *restrict s1, const void *restrict s2, int c, size_t n);描述
该
memccpy()函数应将字节从内存区域复制s2到s1,在复制第一次出现的字节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 标准库实现正是这样做的:
memchr它unsigned char c = (unsigned int)c_in;unsigned char uc = c;unsigned char uc = c;c = (unsigned char)c;(((unsigned char)(*r1++ = *r2++)) != ((unsigned char) c))