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
,然后您可以毫无问题地修改 p
。
char* 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?
在 <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
,然后您可以毫无问题地修改 p
。
char* 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?