我有一个矢量< INT>具有二进制树的inorder遍历。现在我用qsort对它进行排序。之后,当我尝试打印向量的内容时,在运行时发生以下错误。
[main] C:\General_algorithms\binaryTreeToBST.exe 1000 (0) handle_exceptions
: Exception: STATUS_ACCESS_VIOLATION
[main] binaryTreeToBST 1000 (0) handle_exceptions: Dumping stack trace to binary
TreeToBST.exe.core
代码如下:
struct BinTreeNode
{
int id;
BinTreeNode *left;
BinTreeNode *right;
BinTreeNode(int a)
{
id=a;
left=right=NULL;
}
};
int compare (const void *a, const void *b)
{
return ( *(int*)a - *(int*)b );
}
int main()
{
BinTreeNode n10(10);
BinTreeNode n2(2);
BinTreeNode n7(7);
BinTreeNode n8(8);
BinTreeNode n4(4);
n10.left=&n2;
n10.right=&n7;
n2.left= &n8;
n2.right= &n4;
cout<<"OK TILL HERE1"<<endl;
vector<int> InTr= inorder(n10); //returns a vector containing the inorder traversal of the tree.
cout<<"OK TILL HERE2"<<endl;
if(InTr.size()!=0)
qsort(&InTr, InTr.size(), InTr[0], compare);
cout<<"OK TILL HERE3"<<endl; //THIS GETS PRINTED
cout<<InTr[0]; //THIS DOESN'T GET PRINTED(Error occurs)
for(int i=0;i<InTr.size();i++)
cout<<InTr[i]<<endl;
cout<<"OK TILL HERE4"<<endl; //THIS DOESN'T GET PRINTED
return 0;
}
答案 0 :(得分:2)
答案 1 :(得分:2)
&InTr
- 是矢量对象的地址,而不是实际数据。它应该是:
InTr.data() or &InTr[0]
第三个论点应该是:
sizeof(InTr[0]),
像大狼说的那样。
顺便说一下,考虑使用STL中的sort,它更像是“C ++”ish“。
答案 2 :(得分:1)
您的问题来自您的使用:
qsort(&InTr, InTr.size(), InTr[0], compare);
第三个参数需要对元素的大小进行排序。传递InTr[0]
在这里显然是错误的,因为它可以包含int
的任何可能不等于sizeof(vector<int>::value_type)
的值。
使用&InTr
作为第一个参数也是错误的,因为std::vector
中的元素不必从其基址开始。通过传递向量,你有效地让qsort
clobber向量的内部状态。此时,尝试使用向量变得不可预测。幸运的是,在您的情况下,您违反了访问权限。
其他答案已经提到了首选方法,所以我不会在此重述。