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);
}
}
没有分段错误
答案 0 :(得分:1)
在第一个中,您将声明指向char
的指针,并将指向常量char
的指针赋值给。在第二个中,您将声明一个数组char
并给它一个初始值,但它最终不是一个常量。在循环中,您尝试增加指针位置或数组的第一个索引处的值。由于指针指向常量char
,因此失败:您无法更改常量。但是,可以修改数组,因此不会失败。
答案 1 :(得分:0)
您正在使用的体系结构通过将常量字符串char *a="asdasd";
存储在标记为只读的页面中来实现"asdasd"
,因为它真的甚至是const char*
虽然你说不然。这是一件好事,因为它使您的操作系统更容易跨多个进程共享这些页面(就像它可以处理代码一样)。
如果您正在使用gcc,则可以使用-Wwrite-strings
让编译器在您执行此操作时向您发出警告,或者如果您使用的是older version(4.0之前版本),{{1} }(或-fwritable-strings
)不使用只读页面映射。