问题描述
#include<stdio.h>
int main(void)
{
char str1[10]="Versace";
int length(char *p);
char* reverse(char *p);
printf("Length of the array is %d\n",length("Versace"));
printf("Reversed string %s",reverse("Versace"));
}
int length(char*p)
{
int i;
for(i=0;*(p+i)!='\0';i++);
return i;
}
char* reverse(char *p)
{
int i,l;
char temp;
for(l=0;*(p+l)!='\0';L++);
for (i=0;i<(l/2);i++)
{
temp=*(p+i);
*(p+i)=*(p+l-1-i);
*(p+l-1-i)=temp;
}
return(p);
}
我写了一段代码来查找字符串的长度并反转字符串。为此,我制作了2个函数reverse和length。 但是,为什么此代码显示错误?如果我在第二个printf中使用str1作为反向函数的参数,则代码可以正常工作。
解决方法
compiler warning -Wwrite-strings
提供了一个线索。
test.c:9:49: warning: passing 'const char [8]' to parameter of type 'char *' discards qualifiers
[-Wincompatible-pointer-types-discards-qualifiers]
printf("Length of the array is %d\n",length("Versace"));
"Versace"
存储在可执行文件本身中,该可执行文件本身被映射为只读存储器。如果在编辑器中查看可执行文件,您会发现Versace杂乱无章。它是只读的,您正在尝试对其进行修改。
如果我们进行更改,则警告提示并让reverse
接受const char *
,因为您无法更改常量,因此会出现编译器错误。
test.c:22:16: error: read-only variable is not assignable
*(p+i)=*(p+l-1-i);
~~~~~~^
test.c:23:20: error: read-only variable is not assignable
*(p+l-1-i)=temp;
char str1[]="Versace";
还将"Versace"
存储在可执行文件中,但随后将其复制到可以修改的实存储器中。