C 错误原因:不推荐将字符串常量转换为';字符*';[-Wwrite strings]在第5行和第6行?

C 错误原因:不推荐将字符串常量转换为';字符*';[-Wwrite strings]在第5行和第6行?,c,C,这行有错误 char *inorden="IABEGLDCFMKHJ";//line 6 char *postorden; 这行有错误 char *inorden="IABEGLDCFMKHJ";//line 6 char *postorden; 错误在第5行和第6行 编者说: 不推荐将字符串常量转换为“char*”[-Wwrite strings]您的代码没有什么问题,首先 void post(char *pre, char *in, char *pos

这行有错误

   char *inorden="IABEGLDCFMKHJ";//line 6
   char *postorden;
这行有错误

   char *inorden="IABEGLDCFMKHJ";//line 6
   char *postorden;
错误在第5行和第6行 编者说:
不推荐将字符串常量转换为“char*”[-Wwrite strings]

您的代码没有什么问题,首先

   void post(char *pre, char *in,  char *pos,int n)
   {
   int longIzqda;

   if(n!=0){
   pos[n-1]=pre[0];
   longIzqda=strchr(in,pre[0])-in;
   post (pre+1,in,pos,longIzqda);
   post (pre+1+longIzqda,in+1+longIzqda,pos+longIzqda,n-1-longIzqda);
     }
   }



   int main(int argc,char  *argv[])
   {
   int aux;

   aux=strlen(preorden);//convert to string 
   postorden=(char *)malloc(aux*sizeof(char));//use of malloc function
   if (postorden){
   printf("The preorden is: %s\n",preorden);
   printf("The inorden is: %s\n",inorden);
   post(preorden,inorden,postorden,aux);
   postorden[aux]='\0';
   printf("The  postorden calculated is: %s\n",postorden);
   free(postorden);
   }
   else{
   fprintf(stderr,"Whithout memory\n");
   return 1; // return 1 
   }

   return 0;
   }
如果使用
C
中的
-Wwrite strings
标志编译,则强制编译器发出如下警告

从字符串常量到“char*”的转换已弃用 [-Wwrite字符串]

由于字符串literal
GEAIBMCLDFKJH
存储在主存储器的只读部分,即指针指向的位置,该内容是只读的,因此使用
const char*
代替
char*
。例如

char *preorden="GEAIBMCLDFKJH";//line 5
   postorden=(char *)malloc(aux*sizeof(char));//use of malloc function

第二,这里

const char *preorden = "GEAIBMCLDFKJH"; /* const char *ptr means ptr contents is read only */
不需要强制转换malloc结果,因为返回类型是
void*
,它会自动安全地升级为任何其他指针类型,读取。例如

同样在这里(这一点是关于下一行的错误评论,请不要介意)

strlen(preorden)
返回由
preorden
指向的字符串的长度,并被分配给
aux
,而不是在注释中写入(转换为字符串)

并将
post()
定义更改为

   aux=strlen(preorden);//convert to string 

<> >消息“从字符串常量转换为'char * [-WWREST String ]),因为代码被编译为C++代码,它对C.</P>的字符串文字和指针转换有不同的规则。
这可以通过将代码编译为C代码来解决,也可以通过向
char*
插入显式转换来解决。请不要把它扔了。如果您希望得到我们的帮助,我们希望您做出一些努力。使用
const char*
\ifdef\uuu cplusplus
/
>错误编译器
/
\endif
通常来自G++;它不是由GCC在编译C、AFAICR时生成的,这就是@pmg的注释背后的内容。问题在C中存在,但错误消息通常不是。使用
-Wwrite strings
编译时,消息警告:初始化将丢弃指针目标类型[-Wdiscarded限定符]
char*ptr=“abc”中的“const”限定符是为消息中显示的代码行生成的。此答案错误。正如指出的那样,错误可能是由于编译为C++,而不是C作为标记。C++对转换有更严格的规则。C明确允许这些转换(C 2018 6.3.2.6)。警告是违反C++规则的。字符串是否存储在只读内存中是一个实现细节,不是发出警告的原因。请注意,编译器可以警告用户代码存在问题,因为它确实或可能写入字符串文字,这是C标准不允许的。这在Leffler的评论和回答中都提到了,但是在这种情况下,警告消息说初始化丢弃限定符是对代码所做的有问题的事情的警告。但是OP抱怨的消息表示违反了规则,转换被否决。它在C中不被贬低,所以我们知道这个消息来自C++编译,而不是C编译。此外,消息告诉我们为什么它被发布。由于转换已弃用,因此正在发布。因此不会发出它,因为字符串文本位于只读内存中。信息的意思是它所说的。更正我上面的引文:应该是C 2018 6.3.2.3 7。
   aux=strlen(preorden);//convert to string 
void post(const char *pre, const char *in,  char *pos,int n) {
   /* some code*/
}