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

执行与字符串相关的C程序时出现的分段错误,c,pointers,C,Pointers,我有以下代码。我初始化了两个指针,一个在字符串的开头,另一个在字符串的结尾。在每一步之后,我递增第一个指针,递减第二个指针。如果第一个指针的解引用值小于第二个指针的解引用值,我将第一个指针的值复制到第二个指针 #include <stdio.h> #include <string.h> int main() { char *word="aacdbc"; char *p=word; char *q=word+(strlen(word)-1); pr

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

#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;
}
#包括
#包括
int main(){
char*word=“aacdbc”;
char*p=单词;
char*q=word+(strlen(word)-1);
printf(“\n%s\n”,word);
int i;
对于(i=1;iC(和C++)中的字符串文字是不可变的。因此,您尝试更改变量
word

char *word = "aacdbc";

将定义从指针更改为数组

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;
}
#包括
内部主(空)
{
字符字[]=“aacdbc”;
char*p=单词;
char*q=word++sizeof(worrd)-1;
printf(“\n%s\n”,word);
而(p
C(和C++)中的字符串文字是不可变的。因此,您尝试更改变量
word

char *word = "aacdbc";

将定义从指针更改为数组

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;
}
#包括
内部主(空)
{
字符字[]=“aacdbc”;
char*p=单词;
char*q=word++sizeof(worrd)-1;
printf(“\n%s\n”,word);
而(p
因为
word
是指向常量(只读)字符序列的指针。换句话说,您不能更改字符串文本的内容

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

char word[]="aacdbc";

通过这一小的更改,segfault应该消失。

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

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

char word[]="aacdbc";

有了这个小改动,segfault应该消失。

还值得一提的是,当数组位于堆栈(RW)中时,字符串文字是如何存储在代码段(RO)中的.@Dogbert:这可能是一个实现细节,也可能不是。@Deduplicator这种细节类型在所有符合ANSI标准的C编译器中都很常见,并且不限于特定的平台或操作系统。@Dogbert:常量文本既不需要合并,也不需要在代码段中,也不需要在任何类型的只读节中。在系统上有了内存保护或只读内存,大多数编译器在默认情况下都会将它们放在那里,当然,但这不是契约性的。@Dogbert:好吧,最好的文档实际上是标准的。如果你想在这里找到一篇明确处理这一问题的好文章,请看下面的答案:字符串iteral存储在代码段(RO)中,而数组存储在堆栈(RW)中.@Dogbert:这可能是一个实现细节,也可能不是。@Deduplicator这种细节类型在所有符合ANSI标准的C编译器中都很常见,并且不限于特定的平台或操作系统。@Dogbert:常量文本既不需要合并,也不需要在代码段中,也不需要在任何类型的只读节中。在系统上有了内存保护或只读内存,大多数编译器在默认情况下都会将它们放在那里,当然,但这不是契约性的。@Dogbert:好吧,最好的文档实际上是标准的。如果你想在这里找到一篇明确处理这一问题的好文章,请看下面的答案: