微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果在函数中将字符串的名称指定为参数,则代码可以正常工作,但在将字符串本身作为参数时,则会产生错误

如何解决如果在函数中将字符串的名称指定为参数,则代码可以正常工作,但在将字符串本身作为参数时,则会产生错误

#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"存储在可执行文件中,但随后将其复制到可以修改的实存储器中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。