C问题中的字符串操作
可能重复:C问题中的字符串操作,c,pointers,string,C,Pointers,String,可能重复: 大家好,我相信这是一个非常基本的问题,但显然我不太理解这里的一些东西 在寒假期间,我一直在玩C,刚遇到了一些我认为可以用的东西,但给了我一个分割错误 如果我将字符串声明为: 字符名[5]=“Mike”; 我可以操纵字符串:*(name+1)='a';这很好用,名字变成“Make” 如果我声明: char*name=“Mike”; 然后尝试同样的方法:*(name+1)='a';我有一个分割错误。为什么我不能那样做 如果我malloc字符串的空间:char*name=(char*)m
大家好,我相信这是一个非常基本的问题,但显然我不太理解这里的一些东西 在寒假期间,我一直在玩C,刚遇到了一些我认为可以用的东西,但给了我一个分割错误 如果我将字符串声明为: 字符名[5]=“Mike”; 我可以操纵字符串:*(name+1)='a';这很好用,名字变成“Make” 如果我声明: char*name=“Mike”; 然后尝试同样的方法:*(name+1)='a';我有一个分割错误。为什么我不能那样做 如果我malloc字符串的空间:char*name=(char*)malloc(5*sizeof(char));然后将字符串复制到name:strcpy(name,“Mike”);我可以像上面那样操纵它,很好*(名称+1)=“a”;工作 char*name=“Mike”和char*name=(char*)malloc(5*sizeof(char))之间有什么区别;strcpy(名字,“迈克”);?它们不是都指向包含字符串的内存吗
对不起,我的问题太离谱了
char name[5]=“Mike”
声明一个本地数组,并将字符串“Mike”复制到其中char*name=“Mike”
指定指向“Mike”的指针而不进行复制。在这两种情况下,“Mike”都是保存在只读页中的常量字符串,因此在第二种情况下,您试图修改原始常量。当您声明字符数组时,内存在堆栈上分配,您可以对其进行写入
稍后调用malloc()时,可以在堆中分配内存,并可以对其进行写入
当你在中间崩溃时,你已经声明了一个指向内存中的字符串的指针,你不允许改变它。它是静态只读的。
到目前为止,每个人都这么说了,但我不确定它是否足够清晰char array[5] = "Mike"
创建一个常量字符串“Mike”,在大小为5的堆栈上分配一个数组,并将常量字符串复制到其中(理论上……编译器可能会优化一个跳出)
创建相同的常量字符串“Mike”,但只是将指针分配给它,而不是将其复制到本地堆栈
通过“常量字符串”,它可能是内存中分配的字符串,并被操作系统标记为只读,因此您试图修改它会导致分段错误。您试图修改调用未定义行为的字符串文字
char *array="Mike"; /* String Literal is stored in read only section of memory */
*array='P'; /* Undefined Behavior */
C99第6.4.5.6节(第节——字符串文字)明确规定:
如果这些数组的元素具有适当的值,则这些数组是否是不同的,这是不明确的。如果程序试图修改这样一个数组,行为未定义
鉴于
char array[5] = "Mike";/*Creates a local array and copies the string "Mike" into it*/
*array='P';/*Fine*/
同样的问题以前也被问过很多次,例如,编译器是否会将
char*name=“Mike”
案例标记为放弃const
-ness“Mike”,因为“Mike”在技术上是const char*
?或者C不在乎丢弃常量吗?@Mike:没有逻辑可言。这只是因为兼容性的原因从过去遗留下来的一个老疣。
char array[5] = "Mike";/*Creates a local array and copies the string "Mike" into it*/
*array='P';/*Fine*/