将 C 字符串分配给指向字符的指针 - C++ 程序崩溃
Assigning a C string to a ponter to characters - C++ program crashes
我知道您可以使用 string.h
class 来解决这个问题(我使用的是 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] != '[=11=]'; i++)
{
p1[i] = p1[i + 1];
}
return 0;
}
导致崩溃的原因是什么?
p1
指向一个字符串文字,这是不允许您修改的内存。将其声明为 char p1[] =
应该可以解决您的问题。注意你也可以把(p1 + 1)
当成一个字符串,只要你知道p1
.
中至少有一个字符即可
这不是很优雅,但这会起作用:
char *p1 = "192739@something.com";
char p2[100];
int i = 0;
char c = p1[0];
while(c != '[=10=]')
{
c = p1[i+1];
p2[i] = p1[i+1];
i++;
}
您有时可以通过这种方式捕获 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] != '[=10=]'; 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
这段代码是黑客攻击,它使用了处理器和编译器特定的未定义行为,并带有常见的警告。根据您收到的分段错误的种类,这可能不起作用。然而,在许多情况下,程序能够在退出之前 运行 再执行一些命令(可能内存已损坏)。在 ouch 方法内部,您可以执行更多命令并在 OS 销毁程序之前收集有关程序状态的信息。
基本上这是 C++ 程序说:"woah I know I really messed up and the operating system hates me, but let me do just one more thing before the OS reclaims my resources"。
我知道您可以使用 string.h
class 来解决这个问题(我使用的是 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] != '[=11=]'; i++)
{
p1[i] = p1[i + 1];
}
return 0;
}
导致崩溃的原因是什么?
p1
指向一个字符串文字,这是不允许您修改的内存。将其声明为 char p1[] =
应该可以解决您的问题。注意你也可以把(p1 + 1)
当成一个字符串,只要你知道p1
.
这不是很优雅,但这会起作用:
char *p1 = "192739@something.com";
char p2[100];
int i = 0;
char c = p1[0];
while(c != '[=10=]')
{
c = p1[i+1];
p2[i] = p1[i+1];
i++;
}
您有时可以通过这种方式捕获 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] != '[=10=]'; 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
这段代码是黑客攻击,它使用了处理器和编译器特定的未定义行为,并带有常见的警告。根据您收到的分段错误的种类,这可能不起作用。然而,在许多情况下,程序能够在退出之前 运行 再执行一些命令(可能内存已损坏)。在 ouch 方法内部,您可以执行更多命令并在 OS 销毁程序之前收集有关程序状态的信息。
基本上这是 C++ 程序说:"woah I know I really messed up and the operating system hates me, but let me do just one more thing before the OS reclaims my resources"。