C字符串和字符

时间:2014-04-01 17:54:16

标签: c string char

代码A:

char* str="hello";
str[2]='!';
printf("%s\n", str);

在此代码中,程序编译并运行但得到运行时错误: "

但是,如果编写以下代码(代码B):

char str[10]="hello";
str[2]='!';
printf("%s\n", str);

然后,一切都很好。该程序运行并输出" he!lo"。

我不明白代码A和代码B之间的区别如何影响编译器的行为。

据我所知,指向数组的指针指向数组中的第一个元素(意味着指向字符' h'所在的位置,并且任何数组的元素都可以更改使用以下行:str[2]='!';在代码B中,此行正常工作!所以...为什么它在代码A中不好?

3 个答案:

答案 0 :(得分:1)

第二个在堆栈上创建10个字节(可写)并在该分配中放入hello和结束零。第一个在堆栈上创建一个指针,指向位于某处的“hello”字符串。在你的情况下,它可能在内存中创建它没有标记为可写,所以当你运行它时你的程序崩溃了。

答案 1 :(得分:1)

char* str="hello";

compiler, give me a reference to this sequence of chars in memory
do not care if it is read-only memory, just give me the damn pointer!

==

char str[10]="hello";

compiler, please allocate an array of 10 chars for me
and please initialize it with "hello".

答案 2 :(得分:0)

除非您将其声明为str [] =" hello"否则不允许修改。请看这篇文章: assign a string value to pointer