程序崩溃

program crashing

本文关键字:崩溃 程序      更新时间:2023-10-16

我是编程新手。请帮我回答这个问题。

当我执行这个程序时,程序会崩溃。有人能告诉我车祸的确切原因吗?

#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++教程,

  1. 查看此链接
  2. 另一个好的C++资源

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