【问题标题】:Reverse a string in C solution segfaulting反转 C 解决方案中的字符串 segfaulting
【发布时间】:2011-03-07 13:18:31
【问题描述】:

我在 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 指向字符串的开头。那么为什么这不起作用呢?

【问题讨论】:

  • \0 在字符串文字中是自动的

标签: c string segmentation-fault reverse


【解决方案1】:

改变

char * s = "sample text";

char s[] = "sample text";

"sample text" 是一个字符串文字,它可能驻留在地址空间的只读部分中。使用数组语法确保这个字符串被复制到堆栈,这是可写的。

【讨论】:

  • 支持你的答案,而不是 codaddict 的相同答案,因为你做了解释。
  • 可能有点跑题了,但是在只读内存中包含“示例文本”有什么好处?为了节省空间?
  • @Jeff,如果您的代码中有一百个地方都使用相同的字符串文字,编译器只会将一份副本放入您的可执行文件中。现在想象一下,如果其中一个人修改了这个常数。这就是为什么它在只读内存中(而且它是一个常量)。
【解决方案2】:

你的s 指向一个字符串字面量:

char * s = "sample text";

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

要解决此问题,请将 s 设为一个字符数组:

char s[] = "sample text";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2023-03-19
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多