字符串和操纵字符串,这里到底发生了什么。

时间:2014-06-28 12:42:06

标签: c string

为什么我会收到此错误"分段错误(核心转储)"在运行这个程序时,它出了什么问题?

#include <stdio.h>

int main() {

    char *p = "Sanfoundry C-Test";

    p[0] = 'a';

    p[1] = 'b';

    printf("%s", p);

    return 0;
}

3 个答案:

答案 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是你的情况下的指针,你就不能这样做。

有关详细信息,请参阅下面提供的链接

What is the difference between char s[] and char *s?