C 解决方案段错误中反转字符串

发布于 2024-10-20 10:17:26 字数 568 浏览 1 评论 0原文

我在 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;
  }
}

但是我的解决方案是段错误。根据 GDB 的说法,有问题的行如下:

*head++ = *end;

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

I've come up with the following solution in C for reversing a string:

#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;
  }
}

However my solution is segfaulting. According to GDB, the offending line is the following:

*head++ = *end;

The line segfaults on the first iteration of the while loop. end points to the last character of the string "t" and head points to the beginning of the string. So why isn't this working?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

早乙女 2024-10-27 10:17:26

更改

char * s = "sample text";

char s[] = "sample text";

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

Change

char * s = "sample text";

To

char s[] = "sample text";

"sample text" is a string literal which may reside in a read-only section of your address space. Using the array syntax ensures this string is copied to stack, which is writable.

盗梦空间 2024-10-27 10:17:26

您的 s 指向字符串文字:

char * s = "sample text";

在函数 reverse 中,您尝试修改字符串文字,这会导致未定义的行为。

要解决此问题,请将 s 设为 char 数组:

char s[] = "sample text";

Your s is pointing to a string literal:

char * s = "sample text";

In the function reverse you are trying to modify the string literal which results in undefined behavior.

To fix this make s a char array:

char s[] = "sample text";
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文