为什么在这种情况下存在分段错误?

时间:2011-04-30 23:12:32

标签: c

  

可能重复:
  why segmentation fault in this program

int main()
{
        char *a="asdasd";
        int i;

        for(i=0;i<6;i++)
        {
                (*a)++;
                printf("\n%s",a);

        }
}

输出分段错误

int main()
{
        char a[]="asdasd";
        int i;

        for(i=0;i<6;i++)
        {
                (*a)++;
                printf("\n%s",a);

        }
}

没有分段错误

2 个答案:

答案 0 :(得分:1)

在第一个中,您将声明指向char的指针,并将指向常量char的指针赋值给。在第二个中,您将声明一个数组char并给它一个初始值,但它最终不是一个常量。在循环中,您尝试增加指针位置或数组的第一个索引处的值。由于指针指向常量char,因此失败:您无法更改常量。但是,可以修改数组,因此不会失败。

答案 1 :(得分:0)

您正在使用的体系结构通过将常量字符串char *a="asdasd";存储在标记为只读的页面中来实现"asdasd",因为它真的甚至是const char*虽然你说不然。这是一件好事,因为它使您的操作系统更容易跨多个进程共享这些页面(就像它可以处理代码一样)。

如果您正在使用gcc,则可以使用-Wwrite-strings让编译器在您执行此操作时向您发出警告,或者如果您使用的是older version(4.0之前版本),{{1} }(或-fwritable-strings)不使用只读页面映射。