如何使用指针更改字符串中的字符?

时间:2011-07-13 23:06:38

标签: c pointers

我遇到了这段代码的麻烦

int main() {
     char *My_St = "abcdef";
     *(My_St+1)='+';
     printf("%s\n",My_St);
     return 0;
}

我构建了这段代码并且没有错误,但是当我尝试运行它时,它会抛出一个分段错误,有人会说出错了吗

4 个答案:

答案 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";,这样就更清楚你不能做你想做的事。