执行与字符串相关的C程序时出现分段错误

时间:2014-08-14 17:48:45

标签: c pointers

我有以下代码。我初始化了2个指针,一个在开头,另一个在一个字符串的结尾。在每一步之后,我递增第一个指针并递减第二个指针。如果通过解除引用第一个指针获得的值小于通过解除引用第二个指针获得的值,则将第一个指针的值复制到第二个指针。

#include <stdio.h>
#include <string.h>

int main() {
   char *word="aacdbc";
   char *p=word;
   char *q=word+(strlen(word)-1);
   printf("\n%s\n",word);
   int i;
   for(i=1;i<=strlen(word)-1;++i) {
      if(*p<*q) {
         *q=*p;
      }
      ++p;
      --q;
   }
   printf("\n%s\n",word);
   return 0;
}

但代码显示“分段错误错误”。在哪一行我犯了错误?

2 个答案:

答案 0 :(得分:4)

C(和C ++)中的字符串文字是不可变的。因此,您尝试更改变量word

指向的字符串文字
char *word = "aacdbc";

undefined behaviour

将定义从指针更改为数组

char word[] = "aacdbc";

该程序可以采用以下方式

#include <stdio.h>

int main( void )
{
   char word[] = "aacdbc";
   char *p = word;
   char *q = word+ + sizeof( worrd ) - 1;

   printf( "\n%s\n", word );

   while ( p < q && p < --q )
   {
      if ( *p < *q ) *q = *p;
      ++p;
   }

   printf( "\n%s\n", word );

   return 0;
}

答案 1 :(得分:1)

因为word是指向常量(只读)字符序列的指针。换句话说,您无法更改字符串文字的内容。

如果要更改其内容,则应将word声明为字符数组:

char word[]="aacdbc";

如果发生这么小的变化,段错误就会消失。