将C字符串分配给指向字符的指针 - C ++程序崩溃

时间:2015-01-15 20:20:17

标签: c++ arrays string crash

我知道你可以使用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;
}

导致坠机的原因是什么?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

它并不优雅,但这可行:

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

答案 2 :(得分:0)

您有时可以通过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,它使用处理器和编译器特定的未定义行为,它带有通常的警告。根据您收到的分段错误的KIND,这可能不起作用。但是在许多情况下,程序能够在退出之前运行更多命令(可能已损坏的内存)。在ouch方法中,您可能能够在操作系统销毁之前获取更多命令并收集有关程序状态的信息。

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