为了账号安全,请及时绑定邮箱和手机立即绑定

char * str =“ STRING”和char str [] =“ STRING”之间的区别?

char * str =“ STRING”和char str [] =“ STRING”之间的区别?

忽然笑 2019-10-11 10:56:14
在编写一个简单的函数以从字符串中删除特定字符的过程中,我遇到了一个奇怪的问题: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[],在这种情况下,根据定义,声明实际上为堆栈上的整个字符数组分配了可读写的内存。


查看完整回答
反对 回复 2019-10-11
  • 3 回答
  • 0 关注
  • 1828 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信