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*
不是字符串,尽管它可能指向字符串。