分段错误使用双指针参数访问函数内的数组成员

时间:2016-11-11 06:46:21

标签: c arrays pointers multidimensional-array

这是一个非常基本的问题,我认为我仍然误解了一些非常基本的问题。在我的工作中,我试图使用其他人在过去编写的代码并看到错误我和#39;我无法解决。
下面是代码。我在函数Partition2中得到错误。在float pivot = arr[left][0];行。我试过float pivot = *(*(arr+left)+0);,但它是一样的。我知道arr的类型为float [300] [1]。如何使用最小修改的功能?

在test.c中

#define post_nms_topN 300
float unit_bbox_pred[post_nms_topN][4];
float unit_cls_prob[post_nms_topN][1];
...
main()
{
...
    QuickSort2((float **)unit_cls_prob,0,post_nms_topN-1,(float **)unit_bbox_pred);
..
}
在QuickSort2.c中

...
int Partition2(float **arr, int left, int right, float **prop)
{
    float pivot = arr[left][0];   // <=== seg. fault
    //float pivot = *(*(arr+left)+0);

    int low = left+1;
    int high = right;

    while(low <= high)   
    {
        while(pivot <= arr[low][0] && low <= right)
            low++;

        while(pivot >= arr[high][0] && high >= (left+1))
            high--;

        if(low <= high)    
            Swap2(arr, low, high, prop);    
    }
    Swap2(arr, left, high, prop);
    return high;
}

void QuickSort2(float **arr, int left, int right, float **prop)
{
    int pivot;
    if(left <= right)
    {
        pivot = Partition2(arr, left, right, prop); 
        QuickSort2(arr, left, pivot-1, prop);
        QuickSort2(arr, pivot+1, right, prop);
    }
}

1 个答案:

答案 0 :(得分:2)

  

我想我仍然误解了一些非常基本的东西

事实上。指针指针不是2D数组,也不能用于指向2D数组。这是一个常见的误解,因为我们经常可以使用常规指针代替1D数组。我们会得到一个指向第一个元素的指针。然而,数组不是指针,请参阅Is an array name a pointer in C?

2D数组的第一个元素是数组,而不是单个项。你不能设置指向指针的指针,因为指针指针只能用于一个指针数组,这是完全不同的。

关于如何修复您的功能,请参阅Ways to pass 2D Array to function in C。这里有一个代码示例,以及关于数组在用作函数参数时如何“衰减”的更深入的解释。