我是C的新手。所以,愚蠢的问题提示!我想了解编译器如何解释以下语句。
char *str="string1";
*str = "string2"; --> Gives a segmentation fault
puts(ptr);
这可行
char *ptr="string1";
puts(ptr);
ptr="string2";
puts(ptr);
答案 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”;
该语句之所以有效,是因为您在声明时对其进行了初始化,因此它可以正常工作。