如何解决错误:从不兼容类型'const char *'分配给'char'即使我尚未将字符串定义为常量
标题相似的问题在那里,但有所不同,描述性较低! 我正在研究在字符串上使用const并更改字符串。在书中,跟随是可以的,但是不可以。
#include <stdio.h>
int main()
{
char *p="Hello";
/*same error if you add p=p-4*/
*p="bye";/*here*/
printf("%s",p);
return 0;
}
此代码给出错误:从不兼容类型'const char *'分配给'char' 当我如下使用时,没有错误,但输出屏幕为空白。
/*blank output*/
#include <stdio.h>
int main()
{
char *p="Hello";
*p='p';
printf("%s",p);
return 0;
}
OR
/*blank screen*/
#include <stdio.h>
int main()
{
char *p="Hello";
p=p-3;
*p='p';
printf("%s",p);
return 0;
}
但是,如果您使用
p="bye";
它将字符串替换为再见。
请一起看图片
解决方法
字符串文字是只读的。不幸的是,它们没有const char*
类型。这与实际拥有const类型的C ++有所不同。
修改字符串文字是未定义的行为,您永远不要尝试这样做。但是,这是完全有效的:
char arr[]="Hello";
char *p = arr;
*p = 'M';
您在评论中提到,您已经从《 Let us C》一书中了解到,这本书非常糟糕,充满了错误和不良习惯。我在this answer
中写了一本书当我如下使用时,没有错误,但输出屏幕为空白。
这就是未定义行为的世界。从根本上讲,这意味着任何事情都会发生,因为该标准对编译器在调用未定义行为时没有任何要求。请注意,“按照预期的方式工作”是未定义行为的可能结果。
p = p-3;
此行实际上也是未定义的行为。当然,在此操作之后取消对该指针的引用不是一件好事,因为它指向数组的外部。因此,行*p='p';
将写入未分配的内存。但是实际上,即使在这里执行指针算法也是UB。如果您有一个指针p
指向数组中的元素或数组之后的一个元素,并且整数n
为正数或负数,那么p+n
的结果必须是仍然指向相同的数组或过去。否则,即使指针算法也会调用UB。
关于“过去”,请阅读:What is the rationale for one past the last element of an array object?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。