#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void* lsearch(int* key,int* base,int count,int elemSize){
int i = 0;
for(i = 0; i < count; i++){
void* elemAddr = (base + (i * elemSize));
if(memcmp(key,elemAddr,elemSize) == 0){
return elemAddr;
}
}
return NULL;
}
int main(){
int a[] = {10,20,30,40,50,60};
int key = a[2];
printf("\n sizeof(a) : %d \n",sizeof(a));
int size = sizeof(a)/sizeof(a[0]);
printf("\n size : %d \n",size);
int* search = lsearch(&key,a,size,sizeof(int));
printf("\n search : %d \n",*search);
return 0;
}
获得分段错误,不知道为什么for循环循环直到count并返回NULL,因为键30存在于数组a []中。
答案 0 :(得分:3)
这不符合你的想法:
void* elemAddr = (base + (i * elemSize));
指针算法的工作方式,向指针添加值实际上将值乘以基本数据类型大小添加到指针。你不必自己动手。所以这将做你想要的:
void* elemAddr = base + i;
实际上,这里确实没有必要使用memcmp
。您有一个int
和int
值的数组要比较,所以直接这样做:
for(i = 0; i < count; i++){
if (*key == base[i]) {
return &base[i];
}
}
答案 1 :(得分:2)
void* lsearch(int* key,int* base,int count,int elemSize){
int i = 0;
for(i = 0; i < count; i++){
void* elemAddr = (base + (i * elemSize));
问题是如何分配elemAddr
...你正在补偿每个元素的大小以及索引,但是你正在处理int *
数据所以标准指针数学已经为你做了这个补偿;因此你加倍补偿。
void* elemAddr = (base + i);
是你想要的。
或者,您可以将base
的类型更改为void *
,这需要您进行已经在进行的补偿。