Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C问题中的字符串操作_C_Pointers_String - Fatal编程技术网

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*/