C 什么';将字符串定义为数组或字符指针有什么区别?

C 什么';将字符串定义为数组或字符指针有什么区别?,c,arrays,string,char,C,Arrays,String,Char,当我执行下面的代码时 #include <stdio.h> #include <string.h> int main ( ){ char string [] = "Home Sweet Home"; printf ("%s",(char*)memmove(string,&string[5],10)); } #包括 #包括 int main(){ 字符字符串[]=“Home Sweet Home”; printf(“%s”,(char*)m

当我执行下面的代码时

#include <stdio.h>
#include <string.h>
int main ( ){
    char string [] = "Home Sweet Home";
    printf ("%s",(char*)memmove(string,&string[5],10));
    }
#包括
#包括
int main(){
字符字符串[]=“Home Sweet Home”;
printf(“%s”,(char*)memmove(string,&string[5],10));
}
输出为“甜蜜的家”

但是; 当我像下面这样更改代码时

#include <stdio.h>
#include <string.h>

int main ( )
{
    char* string = "Home Sweet Home";
    printf ("%s",(char*)memmove(string,&string[5],10));

}
#包括
#包括
int main()
{
char*string=“Home Sweet Home”;
printf(“%s”,(char*)memmove(string,&string[5],10));
}
它给出了分段错误

当我将这个数组定义为字符指针时,会发生什么变化

当我将这个数组定义为字符指针时,会发生什么变化

在这种情况下,最重要的是:数据的可变性发生了变化

char string [] = "Home Sweet Home";
“Home Sweet Home”
这里是一个for数组
字符串
。它使用具有零终止字符的字符初始化字符串。数组大小是从初始值设定项推断出来的(如果我算对的话),即16个字符。数组
string
声明为
char
,因此它是可变的,您可以更改它

char* string = "Home Sweet Home";

“温馨家园”
这里是一个。字符串文字不可变,不可修改,无法修改。字符串文本的指针存储在
string
pointer中。修改字符串文字将导致未定义的行为。分段错误是程序访问不允许访问的内存位置时发生的错误。在这种情况下,程序试图写入一个不允许修改的内存位置。

string
在第二种情况下,指向不应该尝试更改的内存。但是对于您所说的,我不应该在开始时使用const吗?任何修改文本字符串的尝试都会导致未定义的行为。在第二种情况下,指针
string
指向这样一个文本字符串的第一个字符。这就是为什么建议将所有此类指针设置为
const
,如
const char*string
@burr4ch中所述,除非将它们复制到您自己定义的数组中,然后修改您自己的数组?不,没有办法。burr4ch,“将字符串定义为数组或字符指针之间的区别?”意味着理解错误。字符串不是指针。在第二种情况下,经常使用指向字符串的指针,这种情况下是错误的。“当我将此数组定义为字符指针时”-->数组不是指针,指针不是数组。详细信息:“字符串文字…无法修改。”和“修改字符串文字导致未定义的行为”存在冲突。试图修改是错误的。它可能会工作,可能不会,可能会崩溃。。。很明显,UB.chux是正确的,而且语义正确是很重要的。C标准说它没有定义试图修改字符串文字的行为。告诉某人它是不可变的,可能会导致他们在诊断C实现中的错误时做出错误的推断,而C实现不阻止对字符串文本进行修改。不加限制地断言字符串文字是不可变的、不可修改的或不能修改的是不正确的。