使用qsort()时写访问冲突
Writing access violation while using 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);
}
}
你的代码有几个问题:
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};
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 使用qsort()时写访问冲突