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

时间:2015-05-06 12:11:31

标签: c++ qsort

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

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*总是被视为数组?

如果没有,那么当它不被视为数组时会出现什么情况?

1 个答案:

答案 0 :(得分:3)

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

如果使用C ++编译器编译所有警告,则应该收到类似于

的警告
  
    

警告:ISO C ++禁止将字符串常量转换为&#39; char *&#39; [-Wpedantic]

  

普通的C编译器似乎没有发出警告,但它仍然是未定义的行为。

密切相关:Why do I get a segmentation fault when writing to a string initialized with "char *s" but not "char s[]"?Modifying C string constants?