为什么我会收到此错误"分段错误(核心转储)"在运行这个程序时,它出了什么问题?
#include <stdio.h>
int main() {
char *p = "Sanfoundry C-Test";
p[0] = 'a';
p[1] = 'b';
printf("%s", p);
return 0;
}
答案 0 :(得分:6)
字符串文字在C:
中是不可修改的char *p = "Sanfoundry C-Test";
p[0] = 'a';
最后一个语句调用未定义的行为。
使用用字符串文字初始化的字符数组来定义行为:
char p[] = "Sanfoundry C-Test";
p[0] = 'a';
答案 1 :(得分:1)
正如其他人所说的那样,不应该这样做,因为你正在修改应该(通常是)不可修改的东西。
char *p = "Sanfoundry C-Test";
这声明了一个指针,并将其指向(将指针中包含的地址设置为文本的开头)文本文本(这是常量,不应修改,无论如何都可能无法修改){{ 1}}。
但是AFAIK,你问其余的代码意味着什么,所以让我们首先纠正这个问题:
"Sanfoundry C-Test"
声明具有给定内容的char p[] = "Sanfoundry C-Test";
数组(字符char
,'S'
,'a'
等,后跟0字符)。这样的数组被C. Now
'n'
更改该数组的第一个字符(数组“从0开始计数”),因此字符串中的p[0] = 'a';
更改为'S'
。
'a'
这会将第二个字符更改为p[1] = 'b';
。所以现在字符串是'b'
。最后"abnfoundry C-Test"
然后在控制台中显示该值。
答案 2 :(得分:0)
这是char数组和char指针之间的区别。
char p[]="Sanfoundry C-Test";
然后你可以做
p[0]='a';
p[1]='b';
但如果p是你的情况下的指针,你就不能这样做。
有关详细信息,请参阅下面提供的链接