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、 3 つのルール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 に答える