我收到错误的地方我放了&#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]);
}
}
任何人都可以帮我吗?
答案 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
值并将它们相互减去是有风险的,因为它可能会溢出。