执行与字符串相关的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:好吧,最好的文档实际上是标准的。如果你想在这里找到一篇明确处理这一问题的好文章,请看下面的答案: