error: assigning to 'char' from incompatible type 'const char *'.even if i have not defined string as constant
error: assigning to 'char' from incompatible type 'const char *'.even if i have not defined string as constant
有类似标题的问题,但不同且描述性较差!
我正在研究在字符串上使用 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;
}
或
/*blank screen*/
#include <stdio.h>
int main()
{
char *p="Hello";
p=p-3;
*p='p';
printf("%s",p);
return 0;
}
但是如果你使用
p="bye";
它用 bye 替换字符串。
请看图
Image is from book
Image 2
Image 3
Image 4
字符串文字是只读的。不幸的是,他们没有 const char*
类型。这是与 C++ 的一个区别,它们实际上具有 const 类型。
修改字符串文字是未定义的行为,您永远不应该尝试这样做。然而,这是完全有效的:
char arr[]="Hello";
char *p = arr;
*p = 'M';
您在评论中提到,您从《Let us C》这本书中了解到,这是一本非常糟糕的书,充满了错误和坏习惯。我在 this answer
中写了一篇关于那本书的咆哮
When i use as follows there is no error but output screen is blankblank.
这就是您的 未定义行为 的世界。它基本上意味着任何事情都可能发生,因为标准对编译器在调用未定义行为时应该做什么没有任何要求。请注意,“按预期方式工作”是未定义行为的可能结果。
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?
有类似标题的问题,但不同且描述性较差! 我正在研究在字符串上使用 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;
}
或
/*blank screen*/
#include <stdio.h>
int main()
{
char *p="Hello";
p=p-3;
*p='p';
printf("%s",p);
return 0;
}
但是如果你使用
p="bye";
它用 bye 替换字符串。
请看图
Image is from book
Image 2
Image 3
Image 4
字符串文字是只读的。不幸的是,他们没有 const char*
类型。这是与 C++ 的一个区别,它们实际上具有 const 类型。
修改字符串文字是未定义的行为,您永远不应该尝试这样做。然而,这是完全有效的:
char arr[]="Hello";
char *p = arr;
*p = 'M';
您在评论中提到,您从《Let us C》这本书中了解到,这是一本非常糟糕的书,充满了错误和坏习惯。我在 this answer
中写了一篇关于那本书的咆哮When i use as follows there is no error but output screen is blankblank.
这就是您的 未定义行为 的世界。它基本上意味着任何事情都可能发生,因为标准对编译器在调用未定义行为时应该做什么没有任何要求。请注意,“按预期方式工作”是未定义行为的可能结果。
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?