程序崩溃
program crashing
我是编程新手。请帮我回答这个问题。
当我执行这个程序时,程序会崩溃。有人能告诉我车祸的确切原因吗?
#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
struct s
{
char *str;
};
std::vector<struct s> v;
int main()
{
struct s s1;
strcpy(s1.str,"hi");
v.push_back(s1);
strcpy(s1.str,"hello");
v.push_back(s1);
strcpy(s1.str,"How are you");
v.push_back(s1);
strcpy(s1.str,"AMAZING");
v.push_back(s1);
for (int i=0;i<(int)v.size();i++)
{
printf("%sn",v[i].str);
}
return 0;
}
我正在devc++中编译它。请帮忙。
没有为str
分配内存,而struct s
违反了三条规则:改为使用std::string
。
在声明s
的类型时,不需要指定struct s
(在C中这样做),只需使用s
:
std::vector<s> v;
s s1;
您可以通过提供一个构造函数使struct s
的使用更加方便:
struct s
{
s(const std::string& a_s) : str(a_s) {}
std::string str;
};
v.push_back(s("hi"));
您没有为s1.str
分配任何内存。您通过一个统一的指针进行写入,给出了未定义的行为。
试试类似的东西:
struct s {
std::string str;
};
s s1;
s1.str = "hi";
v.push_back(s1);
// etc.
更好的是,只需直接使用一个字符串和一个C++11初始值设定项列表:
std::vector<std::string> v{"hi", "hello", "how are you", "AMAZING"};
std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "n"));
您没有在结构中为char *str;
分配内存
只需查看strcpy
文档:http://www.cplusplus.com/reference/clibrary/cstring/strcpy/
必须分配您正在复制的内存。但是当你写的时候:
char *str;
没有分配内存。您刚刚创建了一个指针(指向垃圾)
您可以分配内存或更好地使用std::string
,因为在这种情况下,将为您完成
您没有在s.str
中分配内存。
您正在经历未定义的行为。您的char * str
只是一个指针,r,没有分配内存。尽管如此,你还是试图修改它指向的内存。由于该内存不属于你的程序,你会崩溃。
由于是UB,您无法真正判断将发生什么。例如,对我来说,这段代码是运行的。
在使用s1之前,您需要为其分配内存(未初始化的指针指向垃圾)。。使用new
完成后不要忘记使用delete
运算符释放内存。。
我建议你看看一些好的C++教程,
- 查看此链接
- 另一个好的C++资源
注意我已经编辑(更改)了这个答案,因为所有其他答案都正确地解决了这个问题。我只是想给它们加几美分。
- 提升 ASIO Async_receive崩溃程序
- 类指针方法崩溃程序
- get_body来自 IHTMLDocument2 崩溃程序
- 是否有可能存在不会崩溃程序的内存问题
- 调试运行时出现奇怪的崩溃程序(Eclipse C++)
- 儿童对话框 - setWindowTexta或sendmessagea崩溃程序-MFC
- 顶点阵列GLFW崩溃C 程序
- 将值分配给Float数据类型崩溃程序
- OpenCV-将变量添加到类成员崩溃程序
- boost::interprocess::managed_shared_memory 崩溃程序
- 将枚举值分配给整数崩溃程序
- SDL 1.2 -> SDL 2.0(崩溃程序)
- 空析构函数崩溃程序:C++
- 冒泡排序崩溃程序c++
- Ofstream关闭崩溃程序
- 删除字符* 崩溃程序
- c++矢量擦除崩溃程序
- Lua_getglobal崩溃程序
- 通过Copy Constructor创建的e2打印崩溃程序
- RNG崩溃c++程序