2014-01-17 37 views
1
#include <stdio.h> 

void reverse(char *str){ 
    char * end = str; 
    char tmp; 
    if (str){ 
     while(*end){ 
      ++end; 
     } 
     --end; 
     while (str < end){ 
      tmp = *str; 
      *str++ = *end; // segmentation error 
      *end-- = tmp; 
     } 
    } 
} 
    int main() 
    { 
    char *name = "erogol" 
    reverse(name); 
    //printf("%s\n", name); 

    return 0; 
    } 

为什么你认为分割错误发生在我评论的地方?为什么你认为分割错误发生在该代码?

回答

2

因为name(作为字符串文字)是只读的。

使用

char name[] = "erogol"; 

看来你是使用调试器,也可以考虑使用valgrind(有时它提供了更多的细节):

==4040== Process terminating with default action of signal 11 (SIGSEGV) 
==4040== Bad permissions for mapped region at address 0x40065C 
==4040== at 0x400551: reverse (demo.c:16) 
==4040== by 0x40058E: main (demo.c:24) 
+0

就是这两个 – erogol

+0

@erogol之间的技术差异, http://stackoverflow.com/a/12795948/1606345 –

1

因为您修改了字符串文字。

即使他们的类型是char[]而不是char const[]您无权修改它们。