我遇到了这段代码的麻烦
int main() {
char *My_St = "abcdef";
*(My_St+1)='+';
printf("%s\n",My_St);
return 0;
}
我构建了这段代码并且没有错误,但是当我尝试运行它时,它会抛出一个分段错误,有人会说出错了吗
答案 0 :(得分:6)
你不能因为你试图修改const数据。
将其更改为:
char My_St[] = "abcdef";
然后你就可以改变它。
想想你在做什么,你宣布指向"abcdef"
的指针。它是一个指针,不是数组的字符。 "abcdef"
生活在农场中,我的意思是,在你的计划的.text
区域,这是不可改变的。
当你按照我展示的方式进行操作时,你告诉编译器:我正在声明这个数组,它将具有容纳"abcdef"
所需的字符数,以及当你在那里时,将"abcdef"
复制到它。
答案 1 :(得分:2)
char * My_St最有可能是指常量内存。您需要动态分配字符串,然后填充它(使用strcpy)。
char *str = malloc(7);
strcpy(str, "abcdef");
或者
char *str = strdup("abcdef");
然后可以安全地修改str
。
答案 2 :(得分:2)
您通过声明类型为My_St
的{{1}}向编译器提供了提示。为此指针指定字符串文字实际上使其成为char *
,因为无法修改字符串文字,这意味着内存位置是只读的。写入该只读存储器位置是产生段错误的原因。将其从const char *
更改为char *My_St
以使其正常运行。
答案 3 :(得分:0)
基础知识是正确的,但是你的字符串是(幕后)常量且无法修改。你必须定义一个字符数组(例如char[20]
),将字符串复制到其中然后修改字符。
要100%正确,你必须写const char *My_St = "abcdef";
,这样就更清楚你不能做你想做的事。