根據函式定義如下man 3 memccpy:memccpy
概要
#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);
這里要檢查的值對于char. 這個案子應該管用嗎?
uj5u.com熱心網友回復:
這種情況在代碼中究竟是如何處理的
只是將引數的值轉換為字符:
void *memccpy(..., int param_c, ...) {
unsigned char c = param_c;
在現實生活中:https ://github.com/lattera/glibc/blob/master/string/memccpy.c#L33 https://github.com/lattera/glibc/blob/master/string/memchr.c#L63 .
(在現在的系統上)unsigned char有 8 位,(unsigned char)(int)0xffffff76只是變成0x76. 高位被忽略。
uj5u.com熱心網友回復:
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);描述
該
memccpy()函式應將位元組從記憶體區域復制s2到中,在復制第一次出現的位元組(轉換為無符號字符)或復制 n 個位元組后s1停止,以先到者為準。如果復制發生在重疊的物件之間,則行為未定義。c
所以你去,一個簡單的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 : 傳遞給
memchrwhich dounsigned char c = (unsigned int)c_in; - BSD 庫:
unsigned char uc = c; - Bionic (Android):從 BSD 借來的
unsigned char uc = c; - musl libc : 重新分配與演員
c = (unsigned char)c; - uClibc : 比較:
(((unsigned char)(*r1 = *r2 )) != ((unsigned char) c))
uj5u.com熱心網友回復:
memset這是一個較舊的函式,它接受的引數類似于:
void *memset(void *s, int c, size_t n);
在 C 標準中是這樣描述的:
該
memset函式將c(轉換為unsigned charn) 的值復制到所指向的物件的每個第一個字符中s。
這兩個函式至少可以追溯到 4.3 BSD,因此它們以類似的方式處理它們的引數是有意義的。
因此,給定您的示例,值 0xffffff76 將轉換為unsigned char值 0x76,這將是它檢查停止的值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477679.html
