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

在编写一个简单的函数以从字符串中删除特定字符的过程中,我遇到了一个奇怪的问题:


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";。


是不是这样


忽然笑
浏览 1765回答 3
3回答

慕工程0101907

严格说来,声明char *ptr只能保证您指向字符类型。字符串形成已编译应用程序的代码段的一部分并不少见,该代码段将被某些操作系统设置为只读。问题在于,实际上您从未自己为该字符串显式创建内存时,您就对预定义字符串的性质(它是可写的)进行了假设。编译器和操作系统的某些实现可能允许您执行尝试做的事情。另一方面char test[],在这种情况下,根据定义,声明实际上为堆栈上的整个字符数组分配了可读写的内存。
打开App,查看更多内容
随时随地看视频慕课网APP