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?