0

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

当我执行这个程序时,程序会崩溃。谁能告诉我坠机的确切原因?

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

4

6 回答 6

3

没有分配内存str并且违反了三个规则struct s:使用代替。std::string

struct s声明类型时不需要指定(在 C 中) s,只需使用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"));
于 2012-07-31T09:23:12.747 回答
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"));
于 2012-07-31T09:25:36.303 回答
0

您没有char *str;在结构中分配内存

看看strcpy文档:http ://www.cplusplus.com/reference/clibrary/cstring/strcpy/

必须分配要复制的内存。但是当你写:

char *str; 

内存未分配。您刚刚创建了一个指针(指向垃圾)

您可以分配内存或更好地使用std::string,因为在这种情况下将为您完成内存管理。

于 2012-07-31T09:22:17.743 回答
0

您没有在s.str.

于 2012-07-31T09:22:52.280 回答
0

您正在经历未定义的行为。你char * str只是一个指针,没有分配内存。然而,您尝试修改它指向的内存。由于该内存不属于您的程序,因此您将崩溃。

由于它是UB,您无法真正说出发生什么。例如,对我来说,这段代码运行。

于 2012-07-31T09:23:45.600 回答
0

您需要在使用它之前为 s1 分配内存(未初始化的指针指向垃圾).. 使用new它一旦完成不要忘记使用delete运算符释放内存..

我建议你看看一些好的 C++ 教程,

  1. 看到这个链接
  2. 另一个不错的 C++ 资源

注意我已经编辑(更改)了这个答案,因为所有其他人的答案都正确解决了这个问题。我只是想给他们加几分钱。

于 2012-07-31T09:26:56.800 回答