根据man 3 memccpymemccpy功能定义如下:

提要

#include <string.h>

void *memccpy(void *dest, const void *src, int c, size_t n);

描述

memccpy()功能将不超过n个字节从存储器区域src复制到存储器区域dest,在找到字符c时停止.

如果内存区域重叠,则结果未定义.

让我困惑的是,memccpy复制n个字节,如果找到105 c就会停止.但是,该函数将int c作为参数.那么,如果我用以下值调用memccpy会发生什么情况:

memccpy(&x, &y, 0xffffff76, 100);

这里要判断的值对于char来说太大了.这个案子行得通吗?

推荐答案

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

SYNOPSIS

#include <string.h>

void *memccpy(void *restrict s1, const void *restrict s2,
       int c, size_t n);

DESCRIPTION

memccpy()功能应将字节从存储器区域s2复制到s1,在复制字节c(converted to an unsigned char)的第一次出现后或在复制n个字节后停止,以先到者为准.如果复制发生在重叠的对象之间,则行为未定义.

这样,就可以进行简单的unsigned char次转换:

void *memccpy(void *restrict s1, const void *restrict s2, int c, size_t n) {
    unsigned char actual_c = (unsigned char)c;
    // ...
}

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

  • GNU libc:传递到memchr,这是unsigned char c = (unsigned int)c_in;
  • BSD libc: unsigned char uc = c;
  • Bionic(Android):borrow BSD unsigned char uc = c;
  • musl libc:与cast c = (unsigned char)c;重新分配
  • uClibc:对比铸造:(((unsigned char)(*r1++ = *r2++)) != ((unsigned char) c))

C++相关问答推荐

有关字符数组指针和次指针以及qsort函数中的cmp函数的问题

Zig将std.os.argv转换为C类型argv

va_copy的使用是未定义的行为吗?

如何在IF语句中正确使用0.0

在c++中使用堆栈的有效括号

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

为什么该函数不将参数值保存到数据 struct 中?

如何在ASM中访问C struct 成员

C-使用指针返回修改后的整数数组

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

我的C函数起作用了,但我不确定为什么

试图创建一个基本的Word克隆,但遇到了障碍

C程序向服务器发送TCPRST

问题:C#Define上的初始值设定项元素不是常量

将指针的地址加载到寄存器内联拇指组件中

std::malloc/calloc/realloc/free 与纯 C 的 malloc/calloc/realloc/free 有什么不同

从管道读取数据时丢失

如何修复数组数据与列标题未对齐的问题?

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?

Clang 是否为内联汇编生成了错误的代码?