C语言memchr函数实际工作原理及使用相关疑问
关于memchr两个疑问的解答
1. 如何处理大小超过unsigned char的查找值
memchr从设计上不支持直接匹配多字节数值。
C标准对memchr的行为有明确规定:待查找的int类型入参,会被强制转换为unsigned char类型,再和目标内存区域中每一个单独的unsigned char类型字节逐一比对。也就是说它的搜索粒度永远是1字节,超出1字节的部分会被直接截断丢弃。
如果你需要匹配int这类多字节的完整数值,不能直接使用memchr,需要自己实现按对应类型长度逐组比对的搜索逻辑。
2. 示例代码的匹配结果推导
你的推导成立的前提还需要补充系统为大端序的条件,不同字节序下返回的地址偏移不一样:
你给出的测试代码如下:
#include <stdio.h> #include <string.h> int main(void) { const int arr[5] = {0x1021, 0x8988, 0x706, 0x50, 0x22}; int * ptr; ptr = memchr(arr, 0x89, sizeof(arr)); printf("arr:%p ptr:%p\n", arr, ptr); return 0; }
在你假设int占4字节、unsigned char占1字节的前提下:
- 如果是大端序系统:多字节数值的高位存储在低地址,
0x8988的内存排布从低地址到高地址为0x00 0x00 0x89 0x88,0x89位于该元素的第3个字节,叠加第一个int元素占的4字节,总偏移为6(0基地址计数),也就是按1开始计数的第7字节,和你的推导一致。 - 如果是小端序系统(目前主流消费级电子设备大多采用该字节序):多字节数值的低位存储在低地址,
0x8988的内存排布从低地址到高地址为0x88 0x89 0x00 0x00,0x89位于该元素的第2个字节,总偏移为5(0基地址计数),也就是按1开始计数的第6字节。
内容的提问来源于stack exchange,提问作者arka
相关产品推荐
相关产品推荐

