我一直在尝试c中的字符串。 在这段代码中。
#include<stdio.h>
int main()
{
char *arr="output";
*arr='s';
printf("%s",arr);
return 0;
}
在内存中的字符串&#34;输出&#34;得到创建,因为我们有指针arr(位于堆栈中),它最初指向此字符串,为什么不能为指针指定其他一些字符? 当我试图运行这个程序时,我看到运行时错误信号:11这是分段错误。
我已经学会了用c ++,string&#34;输出&#34;在只读内存中创建,导致在编译过程中不推荐将字符串常量转换为'char *'。c中的行为是什么?
有人可以解释一下为什么会导致分段错误吗?这个字符串&#34;输出&#34;在第一时间创建。
感谢。
答案 0 :(得分:7)
在内存中,字符串“output”被创建
数组本身是静态的。它是否与其他具有相同内容的字符串文字数组位于同一位置是未指定的。
为什么不能为指针指定其他一些字符?
这样做会给出未定义的行为。
有人可以解释一下为什么会导致分段错误吗?
许多实现将字符串存储在写保护的内存中,因此如果您尝试,则会出现错误。请注意,在现代C ++中,转换为char*
(而不是const char*
)不仅被弃用,而且被禁止。
c中的行为是什么?
与在C ++中一样,尝试修改文字是未定义的行为,并且未在任何一种语言中指定实现细节。我对C有点过时了,所以我不知道这些天是否允许,弃用或禁止对char*
进行狡猾的转换。
答案 1 :(得分:1)
这是一个很好的资源:https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/
如上所述,主要原因是它是未定义的行为。因为您已经为字符数组分配了空间,并且第一次调用将值设置为输出。然后你试图用可能不同的内存空间更新相同的数组。最好为变量arr释放内存,然后释放malloc新内存。写完后,内存应该是只读的,应该在完成后释放。如果您需要新信息并想要重新使用变量,那么可以为它设置malloc新内存。