【问题标题】:Assigning a C string to a ponter to characters - C++ program crashes将 C 字符串分配给指向字符的指针 - C++ 程序崩溃
【发布时间】:2015-01-15 20:20:16
【问题描述】:

我知道你可以使用string.h 类来解决这个问题(我使用的是 C++),但我想知道我为什么会崩溃。

错误很小,只是崩溃:

Segmentation fault      (core dumped) 

我正在尝试将字符串向左移动一个,以便有效地擦除字符串中的第一个字符。

#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    char * p1 = "192739@something.com";

    for (int i = 0; p1[i] != '\0'; i++)
    {
        p1[i] = p1[i + 1];
    }

    return 0;
}

导致崩溃的原因是什么?

【问题讨论】:

  • 字符串文字。 stringer 文字是不可修改的。修改字符串文字是未定义的行为。
  • 如果您使用 C++,请不要使用 C 和 C++ 双重标记问题。

标签: c++ arrays string crash


【解决方案1】:

p1 指向一个字符串文字,这是不允许修改的内存。将其声明为 char p1[] = 应该可以解决您的问题。请注意,您也可以将(p1 + 1) 视为字符串,只要您知道p1 中至少有一个字符即可。

【讨论】:

    【解决方案2】:

    这并不优雅,但这会起作用:

    char *p1 = "192739@something.com";
    char p2[100];
    
    int i = 0;
    char c = p1[0];
    while(c != '\0')
    {
        c = p1[i+1];
        p2[i] = p1[i+1];
        i++;
    }
    

    【讨论】:

      【解决方案3】:

      您有时可以通过这种方式捕获 C++ 的分段错误。此代码仅用于学习,捕获操作系统被编程为侦听和响应的信号可能会导致古怪的挠头行为,并且需要深入了解操作系统在后台对您的程序所做的事情。

      C++ 代码:

      #include <iostream>
      #include <string.h>
      #include <signal.h>
      #include <cstdlib>
      
      using namespace std;
      
      void ouch(int sig){
          cout << "We get signal, main screen turn on. " << sig << endl;
          exit(0);
      }
      void setup(){
          struct sigaction act;
          act.sa_handler = ouch;
          sigemptyset(&act.sa_mask);
          act.sa_flags = 0;
          sigaction(SIGINT, &act, 0);
          sigaction(SIGSEGV, &act, 0);
      }
      
      void this_method_causes_segmentation_fault_core_dump(){
          char * p1 = "192739@something.com";
          for (int i = 0; p1[i] != '\0'; i++){
              p1[i] = p1[i + 1];
          }
      }
      int main(){
      
          setup();
          this_method_causes_segmentation_fault_core_dump();
      
          return 0;
      }
      

      这段代码为我打印了这个:

      a.cpp: In function ‘void this_method_causes_segmentation_fault_core_dump()’:
      We get signal, main screen turn on. 11
      

      此代码是 hack,它使用处理器和编译器特定的未定义行为,并带有通常的警告。根据您收到的分段错误的种类,这可能不起作用。然而,在许多情况下,程序能够在退出之前运行更多的命令(可能会损坏内存)。在 ouch 方法中,您也许可以在操作系统销毁程序之前再执行一些命令并收集有关程序状态的信息。

      基本上这是 C++ 程序在说:“哇,我知道我真的搞砸了,操作系统讨厌我,但让我在操作系统回收我的资源之前再做一件事”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-12
        • 2021-01-21
        • 1970-01-01
        • 1970-01-01
        • 2011-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多