使用qsort()时写访问冲突

Writing access violation while using qsort()

本文关键字:访问冲突 qsort 使用      更新时间:2023-10-16

我正在使用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);
    }   
}

你的代码有几个问题:

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


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

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];

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

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

是指向字符串字面值的指针数组。无论您将这些字符字面值的位置存储为char*而不是char const*(这只可能由于c++标准委员会希望保持向后兼容性),更改字符串字面值都会导致未定义的行为。

在您的示例中,用于字符串字面值的存储空间将分配在只读内存中,当您尝试写它时将导致访问冲突。

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

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