时间:2019-03-17 标签:c++segfault: char pointers

标签 c++ c pointers char segmentation-fault

Possible Duplicate:
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

最佳答案

两个问题:

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

关于时间:2019-03-17 标签:c++segfault: char pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10919426/

相关文章:

可以在模块初始化完成之前删除 Linux 内核模块吗?

c - 如何使用单个指针定义二维数组

c++ - 用于 C++ 的自回归移动平均 (ARMA) 库

c - 在初始化固定大小的 char 数组时没有足够的空终止符空间时没有编译器错误

c++ - 访问列表 vector 中的结构

linux - 可执行文件上的 setuid 似乎不起作用

c - C 编程中的指针和字符串

c - 警告从默认启用的不兼容指针类型传递参数 1 of ""

c++ - 为什么在应用服务器项目中使用不止一种语言?

c++ - wxWidgets C++ - 在对话框中动态包装 wxStaticText