C语言中的char指针解释

时间:2018-10-06 23:55:43

标签: c pointers

我是C的新手。所以,愚蠢的问题提示!我想了解编译器如何解释以下语句。

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

这可行

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

3 个答案:

答案 0 :(得分:3)

*str = "string2";   --> Gives a segmentation fault

应该这样写:

str = "string2";

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

char* str;

此外,您正在为变量分配常量字符串。因此,如果要为 str 分配可修改的字符串,请使用strcpy(字符串副本):

char str[40];
strcpy(str, "My string");
str[2] = '_'; //replacing space with underscore

答案 1 :(得分:2)

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*的结果的表达式,该结果指向's'"string2"的指针。

C不支持数组分配。

将指针值分配给char对象(一个小整数)没有任何意义-但是几十年前的旧版本C并未在整数和指针之间做出明显区分。理想情况下,现代C编译器应该由于类型冲突而拒绝分配,但是您正在生成的代码将使用类型为char*的地址,将其视为整数,将该整数值截断以存储在单个字节中,和 try 将其存储在数组的第0个元素中。 (您仍然可以在现代C语言中使用强制转换(显式转换)来做到这一点,但您还是不想这样做。)

那么为什么分割错误呢?字符串文字是只读的。 (嗯,有点长话短说;它们不能保证是只读的,但是经常是只读的。)因此,操作系统保护数组"string1"所在的内存块不被修改。分段错误(杀死程序)是当您尝试绕过该保护时操作系统的响应方式。

顺便说一句,最后一行应该是puts(str);,而不是puts(ptr);。在此处发布问题时,最好总是复制并粘贴您编译的 exact 代码。如果有错误,我们需要知道它们是您的实际代码中的错误还是仅仅是拼写错误。

答案 2 :(得分:-2)

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

char * ptr =“ string2”;

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