使用qsort()时写入访问冲突

时间:2014-05-03 00:46:02

标签: c++ qsort

我正在使用qsort c ++函数。我在插入函数中传递wordArr。目标是对属于wordArr的每个单词的字母进行排序。但是,在使用qsort时,我得到写入访问冲突。请让我知道,我的错误在哪里。

char* wordArr[]={"cat","bat","dog"};

int tableClass::compChar(const void* a, const void* b)//in my header file this is static
{
    return *(const char*)a - *(const char*)b;
}
void tableClass::insert(char* wordArr[],const int size)
{
    for (int i = 0; i < size; i++)
    {
        qsort(wordArr[i], strlen(wordArr[i]), sizeof(char),tableClass::compChar);

    }   

}

2 个答案:

答案 0 :(得分:2)

您的代码存在一些问题:

1)参数错误,请查看文档

2)您试图通过重新排序指向分配到只读区域的字符串的指针数组来修改只读内存。这是不允许的,可能导致未定义的行为,即任何事情都可能发生。

我建议将std::sort用于此类事情,并可能使用stl vector

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

void sort_stuff(std::vector<std::string>& arr)
{

    sort(arr.begin(), arr.end());
}

bool myfunction (char *i,char *j) {

    int res = strcmp(i,j); // Needed to compare all characters

    return (res < 0) ? true : false; // Weak ordering criterion
}

int main() {
    std::vector<std::string> arr;
    arr.push_back("cat");
    arr.push_back("dog");
    arr.push_back("bat");

    sort_stuff(arr);

        // --- edit: if you really want to use a char array ---

    char cat[] = "cat";
    char bat[] = "bat";
    char dog[] = "dog";
    char* wordArr[]={cat, bat, dog};
    sort(wordArr, wordArr+sizeof(wordArr)/sizeof(char*), myfunction);
    cout << wordArr[0] << wordArr[1] << wordArr[2];

    return 0;
}

直播:http://ideone.com/ErEWnb


编辑:我不确定你为什么真的想要使用char数组但是如果你真的需要它,你应该

1)将它们放入可写内存(例如本地内存,而不是字符串文字) 2)指定比较函数,因为如果直接将char指针数组传递给sort,您将比较指针而不是它们指向的数据。并确保比较字符串的所有字符。 strcmp做你想做的事

bool myfunction (char *i,char *j) {

    int res = strcmp(i,j); // Needed to compare all characters

    return (res < 0) ? true : false; // Weak ordering criterion
}

...

char cat[] = "cat";
char bat[] = "bat";
char dog[] = "dog";
char* wordArr[]={cat, bat, dog};
sort(wordArr, wordArr+sizeof(wordArr)/sizeof(char*), myfunction);
cout << wordArr[0] << wordArr[1] << wordArr[2];

答案 1 :(得分:1)

您的代码尝试对每个字符串的字符进行排序。

char* wordArr[] = { "cat", "bat", "dog" };

是一个指向字符串文字的指针数组。无论你将那些字符文字的位置存储为char*而不是char const*(这是唯一可能的,因为c ++标准委员会希望保持向后兼容性),更改字符串文字原因未定义的行为。

在您的情况下,字符串文字的存储将分配在只读内存中,当您尝试写入时会导致访问冲突。

通过在您自己的控制下将字符串文字存储在内存中,不会发生访问冲突:

char cat[] = "cat";
char bat[] = "bat";
char dog[] = "dog";
char* wordArr[]={cat, bat, dog};