我仍然收到lldb
错误,因为我可能正在访问内存,我不应该。
看起来我在使用io_seg_sort
中的参数进行操作时出错了,因为在调用qsort
之前,它仍然可以。
#define IO_SEG_IMAX (IO_SEG - 1)
static int io_seg_sort (const void * seg1, const void * seg2) {
int * _seg1 = (int *)seg1;
int * _seg2 = (int *)seg2;
cout << _seg1[1] <<endl; // this gives some random values and not what i am expecting
if (_seg1[1] > _seg2[1]) {
return 1;
}
else if (_seg1[1] < _seg2[1]) {
return -1;
}
else {
return 0;
}
}
int **temp = new int *[IO_SEG];
for (int i = 0; i <= IO_SEG_IMAX; i++) {
temp[i] = new int[2];
memcpy(temp[i], inputs[i], sizeof(int) * 2);
}
qsort(temp, IO_SEG, sizeof(int *) , io_seg_sort);
EDIT1 :问题是我在调用io_seg_sort
而不是我期待的cout
时获得了一些随机值。 inputs[i]
是班级成员int inputs[IO_SEG][2]
;
答案 0 :(得分:3)
您将IO_SEG_MAX + 1
个项目放入IO_SEG
长的数组中。
for (int i = 0; i <= IO_SEG_IMAX; i++) {
temp[i] = new int[2];
memcpy(temp[i], inputs[i], sizeof(int) * 2);
}
应该是:
for (int i = 0; i < IO_SEG; i++) {
temp[i] = new int[2];
memcpy(temp[i], inputs[i], sizeof(int) * 2);
}
但如果你真的打算用C ++做这件事,你应该研究std::vector
和std::sort
。
答案 1 :(得分:1)
您的代码打印垃圾的主要原因是您在比较函数中具有不匹配的间接级别。您传递给temp
的{{1}}数组由指针组成,包含两个元素数组。这意味着在比较函数中,您实际上会收到指向qsort
指针的指针。即这已经不正确了
int
您必须执行类似
的操作static int io_seg_sort (const void * seg1, const void * seg2) {
int * _seg1 = (int *)seg1;
int * _seg2 = (int *)seg2;
cout << _seg1[1] <<endl;
通过static int io_seg_sort (const void * seg1, const void * seg2) {
const int * _seg1 = *(const int *const *) seg1;
const int * _seg2 = *(const int *const *) seg2;
和_seg1
访问您的数组,就像在_seg2
正文中一样(我还添加了一些io_seg_sort
限定符,尽管它们不是代码工作所必需的。)