我收到Segmentation故障:11

时间:2017-02-03 18:08:16

标签: c qsort

我收到错误的地方我放了&#34; <<--&#34; (第9行)标志。它没有任何编译错误,但在输入时它表示&#34;分段错误:11&#34;。我不知道出了什么问题。

输入:

3 3
1 1 1
2 2 2
3 1 5

代码:

#include <stdio.h>
#include <stdlib.h>

int comp (const void * x, const void * y)
{
   int *a = *(int **)x;
   int *b = *(int **)y;

   //getting error here

   if (a[0] == b[0])   // <<-- here
   {
        if (a[2] == b[2])
        {
            return -(a[1] - b[1]);
        }
        else
        {
            return a[2] - b[2];
        }
   }
   else
   {
       return a[0] - b[0];
   }
}

int main()
{
    int n;
    long long d;
    scanf("%d %lld", &n, &d);

    int t[n][3];
    for (int i = 0; i < n; i++)
    {
        scanf ("%d %d %d", &t[i][0], &t[i][1], &t[i][2]);
    }

    printf("%lu\n", sizeof(t[0]));
    qsort(t, n, sizeof(t[0]), comp);

    for (int i = 0; i < n; ++i)
    {
        printf("%d-%d-%d\n", t[i][0], t[i][1], t[i][2]);
    }
}

任何人都可以帮我吗?

1 个答案:

答案 0 :(得分:3)

你的

int t[n][3];

数组实际上是一个由n类型为int [3]的1D数组组成的一维数组。这些int [3]对象是您尝试按

排序的对象
qsort(t, n, sizeof(t[0]), comp)

呼叫。

因此,为了正确比较这些对象,您必须将比较回调的参数解释为int [3]对象的指针。同时,您当前的comp实现被编写为好像参数指向int *个对象,这是不正确的。 int [3]int *是两个非常不同的东西。

这就是你如何做到的

int comp (const void * x, const void * y)
{
  int (*a)[3] = x;
  int (*b)[3] = y;

  // And now compare the arrays by accessing them as `(*a)[1]`, 
  // `(*b)[2]` and so on
}

或者,您可以将comp序言代码写为

int comp (const void * x, const void * y)
{
  const int *a = *(int (*)[3]) x;
  const int *b = *(int (*)[3]) y;

  // And now compare the arrays by accessing them as `a[1]`, 
  // `b[2]` and so on, i.e. keep the rest of your code unchanged
}

这假设您的比较逻辑的其余部分是正确的。请注意,比较int值并将它们相互减去是有风险的,因为它可能会溢出。