在C解决方案segfaulting中反转一个字符串

时间:2011-03-07 13:18:31

标签: c string segmentation-fault reverse

我在C中提出了以下用于反转字符串的解决方案:

#include <stdio.h>

void reverse(char * head);

void main() {

  char * s = "sample text";
  reverse(s);
  printf("%s", s);
}

void reverse(char * head) {

  char * end = head;
  char tmp;

  if (!head || !(*head)) return;

  while(*end) ++end;

  --end;

  while (head < end) {
    tmp = *head;
    *head++ = *end;
    *end-- = tmp;
  }
}

但是我的解决方案是segfaulting。据GDB称,违规行如下:

*head++ = *end;

while循环的第一次迭代中的行段错误。 end指向字符串“t”的最后一个字符,head指向字符串的开头。那么为什么这不起作用呢?

2 个答案:

答案 0 :(得分:32)

更改

char * s = "sample text";

char s[] = "sample text";

“示例文本”是一个字符串文字,可以位于地址空间的只读部分。使用数组语法可确保将此字符串复制到堆栈,这是可写的。

答案 1 :(得分:11)

您的s指向字符串文字:

char * s = "sample text";

在函数reverse中,您试图修改字符串文字,从而导致未定义的行为。

要修复此make s char数组:

char s[] = "sample text";