为什么会出错:在第5行和第6行中,不建议将字符串常量转换为'char *'[-Wwrite-strings]?

时间:2018-10-29 13:42:59

标签: c

   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
   #include <conio.h>
   char *preorden="GEAIBMCLDFKJH";//line 5

上一行错误

   char *inorden="IABEGLDCFMKHJ";//line 6

此行中的错误

   char *postorden;

此行中的错误

   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;
   }

错误在第5行和第6行 编译器说: 从字符串常量到'char *'[-Wwrite-strings]

的弃用转换

2 个答案:

答案 0 :(得分:2)

您的代码很少有问题,首先是

char *preorden="GEAIBMCLDFKJH";//line 5

如果在-Wwrite-strings中使用C标志进行编译,则强制编译器在下面警告您

  

不建议从字符串常量转换为'char *'   [-Wwrite-strings]

因为字符串文字GEAIBMCLDFKJH存储在主存储器的只读部分中,即它指向的指针,所以内容是只读,因此不是{ {1}}使用char*。例如

const char*

char *preorden = "GEAIBMCLDFKJH";/* preorden is normal pointer but "GEAIBMCLDFKJH" is read only, hence error */

第二,这里

const char *preorden = "GEAIBMCLDFKJH"; /* const char *ptr means ptr contents is read only */
不需要

广播malloc结果,因为 postorden=(char *)malloc(aux*sizeof(char));//use of malloc function 返回类型为malloc(),它会自动安全地提升为任何其他指针类型,即读Do I cast the result of malloc?。例如

void*

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

postorden = malloc(aux * sizeof(*postorden));//use of malloc function

aux=strlen(preorden);//convert to string 返回由strlen(preorden)指向的字符串长度,并被分配给preorden,而不是注释中所写(转换为字符串)。

然后将aux的定义更改为

post()

答案 1 :(得分:1)

出现消息“不建议将其从字符串常量转换为'char *'[-Wwrite-strings]”是因为该代码被编译为C ++代码,该代码对于从C转换字符串文字和指针具有不同的规则。

这可以通过将代码编译为C代码来解决,也可以通过在char *上插入显式强制转换来解决。