在编写一个简单的函数以从字符串中删除特定字符的过程中,我遇到了一个奇怪的问题:void str_remove_chars( char *str, char to_remove){ if(str && to_remove) { char *ptr = str; char *cur = str; while(*ptr != '\0') { if(*ptr != to_remove) { if(ptr != cur) { cur[0] = ptr[0]; } cur++; } ptr++; } cur[0] = '\0'; }}int main(){ setbuf(stdout, NULL); { char test[] = "string test"; // stack allocation? printf("Test: %s\n", test); str_remove_chars(test, ' '); // works printf("After: %s\n",test); } { char *test = "string test"; // non-writable? printf("Test: %s\n", test); str_remove_chars(test, ' '); // crash!! printf("After: %s\n",test); } return 0;}我不明白为什么第二项测试失败了?对我来说,它看起来像第一表示char *ptr = "string";相当于这一个:char ptr[] = "string";。是不是这样
3 回答
慕工程0101907
TA贡献1887条经验 获得超5个赞
严格说来,声明char *ptr只能保证您指向字符类型。字符串形成已编译应用程序的代码段的一部分并不少见,该代码段将被某些操作系统设置为只读。问题在于,实际上您从未自己为该字符串显式创建内存时,您就对预定义字符串的性质(它是可写的)进行了假设。编译器和操作系统的某些实现可能允许您执行尝试做的事情。
另一方面char test[],在这种情况下,根据定义,声明实际上为堆栈上的整个字符数组分配了可读写的内存。
添加回答
举报
0/150
提交
取消