C 字符串初始化的差异

C 字符串初始化的差异,c,arrays,string,C,Arrays,String,以下字符串初始化之间是否存在任何差异: char *string = "Hello"; vs 我在示例中看到了这两种初始化。谢谢 char string[]在堆栈上或存储全局变量的内存段中创建一个字符数组char*string创建一个char指针,指向存储编译时cinstants的内存段中的数组。在C++中,它将是只读内存,不确定C.< /P> < P>你现在已经改变了这个问题。这里有两个区别:在第一种情况下 char *string = "Hello"; 字符串是“文本”,不能修改。变量

以下字符串初始化之间是否存在任何差异:

char *string = "Hello"; 
vs


我在示例中看到了这两种初始化。谢谢

char string[]
在堆栈上或存储全局变量的内存段中创建一个字符数组
char*string
创建一个char指针,指向存储编译时cinstants的内存段中的数组。在C++中,它将是只读内存,不确定C.< /P> < P>你现在已经改变了这个问题。这里有两个区别:在第一种情况下

char *string = "Hello";
字符串是“文本”,不能修改。变量
string
是一个指针,根据您使用的是32位还是64位,其内存需求为4或8个字节

在第二种情况下

char string[] = "Hello";
文本被复制到数组
string
,该数组使用6个字节的内存(需要对齐)-“Hello”长度和字符串终止符。您可以修改此数组

对你的原始问题的评论:检查你认为应该正常工作的每个功能的结果,并提供一个恢复策略(或者至少是一个有理由的尖锐退出)是非常无聊的,因为这不会让你更接近你的目标。它使开发工作翻了一番,但新手没有意识到这一点,调试的痛苦减少了一半或四分之一(并且作为一种编码原则,使得代码更加健壮)。

char string[]=“Hello”:

1) 生成一个数组,该数组包含实际字符“Hello\0”,该字符具有提供的名称,正好位于定义所在的位置

2) 生成的数组可以由执行的代码修改

char*string=“你好”;:

1) 生成一个数组,其中包含只读内存中的实际字符“Hello\0”,并将一个指针放在该字符串上,该字符串具有提供的名称,正好位于定义所在的位置


2) 生成的数组不能被执行的代码修改;但是指针可以修改为指向其他地方。

字符串文本中没有换行符
“Hello”
。字符串的“终止字符”不是换行符。字符串终止于
“\0”
而不是
“\n”
,该字符编码的不是此字符。我打赌他在视频的某个地方提到了
fgets
及其相关的小问题。我打赌你从
printf
中得到了一个非常奇怪的结果!始终检查返回值-此处为
NULL
char string[] = "Hello";