【问题标题】:c++ segfault: char pointers [duplicate]c ++ segfault:char指针[重复]
【发布时间】:2012-06-10 18:38:00
【问题描述】:

可能重复:
How do you reverse a string in place in C or C++?
Why is this C code causing a segmentation fault?
Modifying value of char pointer in c produces segfault

运行一个非常简单的代码示例

#include <stdlib.h>
#include <iostream>

char* last_char(char* s){
  char* last = s;
  while (*last) ++last;
  return last;
}

char* in_place_reverse(char* s) {
  char* left = s;
  char* right = last_char(s);
  char temp;

  while( left < right ) {
    temp = *left;
    *left = *right;
    *right = temp;

    left++;
    right--;
  }

  return s;
}

int main(){
  char * s = "letters\n";
  std::cout << in_place_reverse(s);
}

我总是得到

 Segmentation fault

但从我的角度来看,我并没有在代码中做任何非法的事情。 请帮我确定问题所在。

附:我用

编译
g++ example.c

【问题讨论】:

  • 您应该在调试器中运行此代码。它会告诉你哪条线导致了段错误,你应该能够从那里向后工作。
  • 请注意,您的函数 last_char 返回分隔符 \0,因此如果您的代码不会出现段错误,那么 std::cout 将不会输出任何内容,因为您在字符串中的第一个字符将在还原后为 \0

标签: c++ c pointers char segmentation-fault


【解决方案1】:

两个问题:

  1. 您正在尝试修改字符串文字。这可能有效,也可能无效,或者可能崩溃。这是调用未定义的行为。使用 char s[] = "letters\n" 制作可变副本。
  2. last_char() 实际上返回指向字符串末尾的标记'\0' 的指针——它指向最后一个字符之外。将return last 更改为return last - 1。否则你也会移动哨兵,这几乎肯定不是你想要的。 (请注意,如果字符串长度为零,这将返回一个指向垃圾的指针。如果*s == '\0',您应该在in_place_reverse() 中快速成功以避免这种复杂性。)

【讨论】:

  • 你确定#2吗?我已经单独对其进行了测试,它总是返回最后一个字符。如果循环是while (*last++);,它将返回 '\0'
  • 是的。仅当 !*last 时,last_char() 才会返回 last
【解决方案2】:

您正在修改字符串文字,而字符串文字是不可修改的。

改用char s[] = "letters\n";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2021-04-03
    • 2012-08-01
    • 2013-01-11
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多