C语言中的分段错误

时间:2015-10-22 17:42:48

标签: c

      #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 []中。

2 个答案:

答案 0 :(得分:3)

这不符合你的想法:

void* elemAddr = (base + (i * elemSize));

指针算法的工作方式,向指针添加值实际上将值乘以基本数据类型大小添加到指针。你不必自己动手。所以这将做你想要的:

void* elemAddr = base + i;

实际上,这里确实没有必要使用memcmp。您有一个intint值的数组要比较,所以直接这样做:

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 *,这需要您进行已经在进行的补偿。