我是编程的新手。请帮我解决这个问题。
当我执行此程序时,程序将崩溃。谁能告诉我撞车的确切原因?
#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("%s\n",v[i].str);
}
return 0;
}
我在devc ++中编译它。 请帮助。
答案 0 :(得分:3)
没有为str
分配内存而struct s
为violating the rule of three:请改用std::string
。
在声明struct s
类型时,您无需指定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"));
答案 1 :(得分:2)
您尚未为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"));
答案 2 :(得分:0)
您没有为结构
中的char *str;
分配内存
只需查看strcpy
文档:http://www.cplusplus.com/reference/clibrary/cstring/strcpy/
你要复制的内存必须分配。但是当你写道:
char *str;
内存未分配。你刚刚创建了一个指针(垃圾)
您可以分配内存或更好地使用std::string
,因为在这种情况下将为您完成内存管理
答案 3 :(得分:0)
您没有在s.str
中分配内存。
答案 4 :(得分:0)
您遇到了未定义的行为。你的char * str
只是一个pointe,没有分配内存。不过,您尝试修改它指向的内存。由于该内存不属于您的程序,因此您将崩溃。
因为它是UB,你无法真正告诉将发生什么。例如,对我来说这个代码运行。
答案 5 :(得分:0)
你需要在使用之前为s1分配内存(uniniatialized指针指向垃圾)。使用new
一旦完成,不要忘记使用delete
运算符释放内存。
我建议您查看一些优秀的C ++教程,
注意我已编辑(更改)此答案,因为所有其他人都能正确解答问题。我只是想给他们增加几美分。