2011-04-30 181 views
0

可能重复:
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); 

     } 
} 

没有分段故障

+1

第一个程序中的分段错误,因为你很幸运。在第二个程序中没有分段错误,因为你不走运。调用'printf()'(或任何接受可变数量参数的函数)时,如果没有范围原型调用未定义行为。未定义行为的一个表现是分段错误(一种很好的表现形式);另一个是一切正如你期望的那样工作(一个不好的表现)......哦,你也试图在第一个程序中更改一个不可修改的数组:另一个未定义行为的案例 – pmg 2011-04-30 23:18:22

+0

@pmg你能否提供一些关于表现的链接未定义的行为? – bacchus 2011-04-30 23:22:43

+0

@bacchus:http://c2.com/cgi/wiki?UndefinedBehavior – pmg 2011-04-30 23:32:02

回答

1

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

+0

根据你的回答,在C字符串文字中(类型为char [])衰减为char *,而不是const char *。我认为向指针添加'const'是一个好主意('const char * a =“foo”;'),但这与问题无关 – pmg 2011-04-30 23:21:15

+0

但是不是icktoofay的观点,即字符串文字是'常量' (即不可修改) - 这不是关于'const'关键字。 – 2011-04-30 23:23:15

+0

@pmg:我很抱歉,我试图说数组是可以修改的,但是定义为char *的那个被赋值为const char *的值不是。也许我并没有像以前那么清楚。 – icktoofay 2011-04-30 23:23:18

0

架构你使用工具char *a="asdasd";通过存储常量字符串"asdasd"在被标记为只读,因为它真的const char*即使你说,否则页面。这是一件好事,因为它使您的操作系统更容易在多个进程之间共享这些页面(就像它可以对代码执行操作一样)。

如果你正在使用gcc,你可以使用-Wwrite-strings可以让编译器警告你,当你这样做,或者如果您使用的是older version(预4.0),-fwritable-strings(或-traditional)不使用读 - 只有页面映射。

+0

嗯..在C字符串文字是'char []',而不是'const char []'或'const char *'。使用'gcc -Wwrite-strings'使得gcc成为类似于C语言的编译器实现,但不完全是C. – pmg 2011-04-30 23:36:26

+0

@pmg字符串文字具有形式类型'char []'而不是语义类型'const char []'。 C++用他们最后一次迭代改变了它,C编译器必然会遵循。 – geocar 2011-04-30 23:46:53

相关问题