C语言中的字符指针解释

C语言中的字符指针解释,c,pointers,C,Pointers,我对C有点陌生。所以,愚蠢的问题提醒!我想了解编译器是如何解释以下语句的 char *str="string1"; *str = "string2"; --> Gives a segmentation fault puts(ptr); 然而这是有效的 char *ptr="string1"; puts(ptr); ptr="string2"; puts(ptr); 这个 应该这样写: str = "string2"; char* str; str标识符的类型为char*,即指向

我对C有点陌生。所以,愚蠢的问题提醒!我想了解编译器是如何解释以下语句的

char *str="string1";
*str = "string2";   --> Gives a segmentation fault
puts(ptr);
然而这是有效的

char *ptr="string1";
puts(ptr);
ptr="string2";
puts(ptr);
这个

应该这样写:

str = "string2";
char* str;
str标识符的类型为char*,即指向char的指针。为了避免错误,您可以这样写:

str = "string2";
char* str;
此外,您正在为变量指定一个常量字符串。因此,如果要将可修改字符串指定给str,请使用strcpy(字符串副本):

这个

应该这样写:

str = "string2";
char* str;
str标识符的类型为char*,即指向char的指针。为了避免错误,您可以这样写:

str = "string2";
char* str;
此外,您正在为变量指定一个常量字符串。因此,如果要将可修改字符串指定给str,请使用strcpy(字符串副本):

*str=“string2”——>给出分段错误,因为您试图将多个字符的值分配给char pointer*str,该char pointer*str应仅返回一个char值,因为它是char指针而不是字符串指针

char*ptr=“string2”

此语句之所以有效,是因为您在声明时对其进行了初始化,因此它有效。

*str=“string2”-->给出分段错误,因为您试图将多个字符的值分配给char pointer*str,该char pointer*str应仅返回一个char值,因为它是char指针而不是字符串指针

char *str="string1";
*str = "string2";   --> Gives a segmentation fault
puts(ptr);
char*ptr=“string2”

此语句之所以有效,是因为您在声明时正在初始化它,因此它可以工作

char *str="string1";
*str = "string2";   --> Gives a segmentation fault
puts(ptr);
您的作业
*str=“string2”违反了约束

C标准(也许很不幸)不要求C编译器拒绝不正确的程序。对于某些类型的错误,它确实需要诊断消息,但在某些情况下,并非所有编译器都会这样做。您应该了解使用哪些选项来诊断更多错误

如果编译器确实给了您一条警告消息,不要忽略它。来自C编译器的警告可能与次要的风格问题有关,也可能与您希望被视为致命错误的内容有关。你需要学会如何区分不同

*str
属于
char
类型<代码>“string2”
是一个字符串文本,它的类型为
char[8]
,数组为
char
。但在大多数上下文中(这是C的另一个奇怪之处),数组类型的表达式被视为指针类型的表达式。因此,
“string2”
被视为一个表达式,产生类型为
char*
的结果,一个指向
“string2”
的“
的指针

C不支持数组的赋值

将指针值指定给
char
对象(一个小整数)是没有意义的——但是几十年前的旧版本C并没有对整数和指针进行严格区分。理想情况下,现代C编译器应该因为类型冲突而拒绝赋值,但您正在生成的代码采用
char*
类型的地址,将其视为整数,截断该整数值以存储在单个字节中,并尝试将其存储在数组的第0个元素中。(在现代C语言中,您仍然可以通过强制转换和显式转换来实现这一点,但无论如何您都不想这么做。)

那么,为什么会出现分割错误呢?字符串文字是只读的。(好吧,说来话长;它们不能保证是只读的,但它们通常是只读的。)因此,存储数组的内存块
“string1”
受到操作系统的保护,不会被修改。当您试图绕过保护时,操作系统会做出怎样的反应,这就是导致程序死机的分段错误

顺便说一下,最后一行应该是
put(str),而非
put(ptr)。在这里发布问题时,最好复制并粘贴您编译的确切代码。如果有错误,我们需要知道它们是实际代码中的错误,还是仅仅是打字错误

您的作业
*str=“string2”违反了约束

C标准(也许很不幸)不要求C编译器拒绝不正确的程序。对于某些类型的错误,它确实需要诊断消息,但在某些情况下,并非所有编译器都会这样做。您应该了解使用哪些选项来诊断更多错误

如果编译器确实给了您一条警告消息,不要忽略它。来自C编译器的警告可能与次要的风格问题有关,也可能与您希望被视为致命错误的内容有关。你需要学会如何区分不同

*str
属于
char
类型<代码>“string2”
是一个字符串文本,它的类型为
char[8]
,数组为
char
。但在大多数上下文中(这是C的另一个奇怪之处),数组类型的表达式被视为指针类型的表达式。因此,
“string2”
被视为一个表达式,产生类型为
char*
的结果,一个指向
“string2”
的“
的指针

C不支持数组的赋值

将指针值指定给
char
对象(一个小整数)是没有意义的——但是几十年前的旧版本C并没有对整数和指针进行严格区分。理想情况下,现代C编译器应该因为类型冲突而拒绝赋值,但您正在生成的代码采用
char*
类型的地址,将其视为整数,截断该整数值以存储在单个字节中,并尝试将其存储在数组的第0个元素中。(在现代C语言中,您仍然可以通过强制转换和显式转换来实现这一点,但无论如何您都不想这么做。)

那么,为什么会出现分割错误呢?字符串文字是只读的。(好吧,说来话长;它们不能保证是只读的,但它们通常是只读的。)因此持有arr的内存块