当我尝试修改字符串常量时,为什么会出现分段错误?

时间:2011-08-05 14:48:54

标签: c string

  

可能重复:
  Why do I get a segmentation fault when writing to a string?

我希望这个程序的输出是:ibjgsjfoet 但是我遇到了分段错误。

#include <stdio.h>
int main()
{

    char *p="haifriends",*p1;
    p1=p;
    while(*p!='\0')
    ++*p++;
    printf("%s   %s",p,p1);
    return 0;

}

6 个答案:

答案 0 :(得分:10)

  

我希望这个程序的输出是:ibjgsjfoet

char *p="haifriends",*p1;

haifriends位于内存的只读部分,无法修改。如果你想修改字符串文字,那么你必须复制。

char p[]="haifriends",*p1;
p1 = p;

答案 1 :(得分:7)

在同一声明中使用两个自动增量是一个麻烦。不要试图变得棘手。编写代码,使其清晰,富有表现力,您将获得更好的结果。

答案 2 :(得分:2)

您正在尝试修改字符串文字:

char *p="haifriends";
++*p;

通常,字符串文字分配在不可写的内存中,因此是段错误。

答案 3 :(得分:1)

无法写入p所在的内存区域。您只能修改已malloc或存在于堆栈中的内存:

#include <stdio.h>
int main()
{
    char buffer[11];
    char *p,*p1;

    strcpy(buffer, "haifriends");
    p = &buffer[0];

    p1=p;
    while(*p!='\0')
    ++*p++;
    printf("%s   %s",p,p1);
    return 0;
}

这绝不是一种好的做法,但我希望这个示例代码能够澄清这个问题。

答案 4 :(得分:1)

这将有效:

#include <stdio.h>
int main()
{

    char p[11]="haifriends";
    char *p1;
    p1=p;
    while(*p1!='\0')
    ++*p1++;
    printf("%s   %s",p,p1);
    return 0;
}

大多数编译器都会在从常量字符串转换为char *

时发出警告

答案 5 :(得分:0)

尝试将*p="haifriends"更改为p[]="haifriends"。 Iirc不允许修改分配给常规字符指针的字符串文字,但是当它们被分配给字符数组时。

++*p++;也是未定义的行为。试试*p++;p++;,或者++*(p++);,如果这也不是未定义的行为(非常肯定会是这样)。

根据Michael的说法,++*p++;并非未定义的行为,但我仍然建议您使用*p++;p++;++*(p++);进行澄清,因为他同意这是一个好主意。< / p>