程序崩溃

时间:2012-07-31 09:21:10

标签: c++

我是编程的新手。请帮我解决这个问题。

当我执行此程序时,程序将崩溃。谁能告诉我撞车的确切原因?

#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 ++中编译它。 请帮助。

6 个答案:

答案 0 :(得分:3)

没有为str分配内存而struct sviolating 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 ++教程,

  1. see this link
  2. Another good C++ resource
  3. 注意我已编辑(更改)此答案,因为所有其他人都能正确解答问题。我只是想给他们增加几美分。