C语言通用查找函数使用char*而非int*遍历数组的原因咨询
问题原因分析
这个差异本质是C语言指针算术的类型依赖特性导致的偏移量计算错误,具体逻辑如下:
- C语言中指针做加法运算时,偏移的字节数会自动乘以指针指向类型的大小:比如
T* ptr;,ptr + n的实际偏移字节数为n * sizeof(T)。
使用char* ptr的正确逻辑
char类型的大小固定为1字节,因此ptr + i * ele_size的实际偏移字节数就是1 * i * ele_size = i * ele_size,完全符合通用查找的设计预期:
传入的ele_size是单个数组元素的大小,每次偏移ele_size字节刚好定位到下一个元素的首地址,遍历所有元素时能正确匹配目标值。
替换为int* ptr的错误逻辑
int类型在常见环境下大小为4字节,此时ptr + i * ele_size的实际偏移字节数变成了sizeof(int) * i * ele_size。你测试时传入的ele_size是sizeof(int)=4,因此i=2时实际偏移量为4 * 2 *4 = 32字节,已经远远超出了5个元素的int数组(总大小仅20字节)的地址范围,遍历全程都不会匹配到目标值,最终返回-1。
补充:这个search函数的设计初衷是实现通用类型数组查找,使用
char*做基址就是为了用1字节的步长适配任意类型的元素大小,不管是int、double还是自定义结构体都能正常工作,如果固定为int*就失去了通用性。
内容的提问来源于stack exchange,提问作者Hash include
相关产品推荐
相关产品推荐

