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

Confusion between char* and char[] in qsort()

<stdlib.h> 中声明的标准 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() 修改它们指向的内容(即字符串常量)会产生未定义的行为。这与场景 char p[] = "some string"; 不同,在这种情况下,您使用字符串文字的内容初始化数组 p,然后您可以毫无问题地修改 pchar* arr[] 的正确定义应该是 const char* arr[],正是为了防止此类问题。

如果您在 C++ 编译器上使用所有警告进行编译,您应该会收到类似于

的警告

warning: ISO C++ forbids converting a string constant to 'char*' [-Wpedantic]

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

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