[英]C++ Program crashes
为什么后面的程序在“完成!”之后停留在随后的循环中,然后以崩溃告终?
#include <iostream>
using namespace std;
#include <cstring>
struct stringy{
char * str;
int ct;
};
void set(stringy & s, const char * cs);
void show(const char * s, int times=1);
void show(const stringy & s, int times=1);
int main(){
stringy beany;
char testing[] = "Reality isn't what it is used to be.";
set(beany, testing);
show(beany);
show(beany, 2);
testing[0] = 'D';
testing[1] = 'u';
show(testing);
show(testing, 3);
show("Done!");
return 0;
}
void set(stringy & s, const char * cs){
s.ct = strlen(cs);
strcpy(s.str, cs);
}
void show(const char * s, int times){
while (times-- > 0){
cout << s << endl;
}
}
void show(const stringy & s, int times){
show(s.str, times);
}
您做了很多strcpy
,但是您的malloc
在哪里?
如果使用C ++,则应真正使用std :: string来避免此类情况。
复制前为字符串分配内存
void set(stringy & s, const char * cs){
s.ct = strlen(cs);
s.str = new char[s.ct+1];
strcpy(s.str, cs);
}
释放内存
delete[] beany.str;
各种问题:
struct stringy{
char * str;
int ct;
};
// [snip]
stringy beany;
char testing[] = "Reality isn't what it is used to be.";
set(beany, testing);
void set(stringy & s, const char * cs){
s.ct = strlen(cs);
strcpy(s.str, cs);
}
在调用strcpy
, s.str
只是一个野指针。 它没有指向任何有效的东西。
这可能是家庭作业,但如果不是,则应使用std::string
而不是raw char*
。 如果需要使用原始char*
,则需要分配空间(使用new
指针,或者更好的是使用智能指针),该指针指向该空间。 您不能只是将字符串复制到超空间中并期望它起作用。
运行程序时出现分段错误。 您需要在调用strcpy之前为s.str分配内存。
void set(stringy & s, const char * cs){
s.ct = strlen(cs);
strcpy(s.str, cs);
}
s.str未分配。 你需要做一个
s.str = malloc(s.ct);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.