C++ qsort()中char*和char[]之间的混淆

C++ qsort()中char*和char[]之间的混淆,c++,qsort,C++,Qsort,在中声明的标准qsort()函数中,当我执行以下操作时,它崩溃: char *arr[]={"abc","def"}; qsort((void*)arr[i],strlen(arr[i]),sizeof(char),compare); 为了让它工作,我必须这样使用它: int len=strlen(arr[i]); char *buffer=new char[len+1]; strcpy(buffer, arr[i]); qsort((void*)buffer,strlen(a

中声明的标准
qsort()
函数中,当我执行以下操作时,它崩溃:

char *arr[]={"abc","def"};
qsort((void*)arr[i],strlen(arr[i]),sizeof(char),compare);
为了让它工作,我必须这样使用它:

int len=strlen(arr[i]);
char *buffer=new char[len+1];
strcpy(buffer, arr[i]);        
qsort((void*)buffer,strlen(arr[i]),sizeof(char),compare);
qsort()
的声明也将
void*
指定为第一个参数时,为什么第一个方法不起作用

我知道在第一个方法中,我传递的不是数组,而是
char*
是否总是被视为数组


如果不是,那么在什么情况下它不被视为数组?

数组的元素
arr
是指向字符串常量的非常量指针。试图通过
qsort()
修改它们指向的内容(即字符串常量)会产生未定义的行为。这与场景
charp[]=“some string”不同
,在这种情况下,使用字符串文本的内容初始化数组
p
,然后可以毫无问题地修改
p
char*arr[]
的正确定义应该是
const char*arr[]
,这正是为了防止此类问题

如果您在C++编译器上使用所有警告编译,则应该得到类似

的警告。 警告:ISO C++禁止将字符串常量转换为'char * '- Wpedantic ] < 普通C编译器似乎不会发出警告,但它仍然是未定义的行为


密切相关:而且

char*始终被视为char*,只是C中没有对字符串的真正支持,所以他们决定使用char*表示字符串。同样,你的问题被标记为C++,所以请考虑使用STD::String和STD::排序,你不必强制转换为<代码>空洞*/CUT>,第二个参数是数量排序(应该是2,而不是3)。C不支持字符串;只是没有名为
string
的数据类型。根据定义,字符串是“由第一个空字符终止并包括第一个空字符的连续字符序列”。
char*
不是字符串,尽管它可能指向字符串。