在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*
总是被视为数组?
如果没有,那么当它不被视为数组时会出现什么情况?
答案 0 :(得分:3)
数组arr
的元素是字符串常量的非常量指针。试图通过qsort()
修改它们指向的内容(即字符串常量)会产生未定义的行为。这与方案char p[] = "some string";
不同,在这种情况下,您使用字符串文字的内容初始化数组p
,然后您可以毫无问题地修改p
。
char* 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?