2

C++を学び始めたばかりです。構造に問題がありました。構造体にデータを追加しているときに、プログラムが構造体に文字列を追加しようとするとくちばしになります。どこに問題があるのか​​ 本当にわかりません。ここに私のコードがあります:

    #include "stdafx.h"
#include <iostream>
#include <string>
using  namespace std;

int main(void)
{
    typedef struct hardware
{
    int id; // will store information
    string name;
    int year;
    float price;
    hardware *next; // the reference to the next hardware
};

    hardware *head = NULL;  //empty linked list
    int tempid = 0,tempyear=0, hardware_number = 0,  counter = 0;
    string tempname="";
float tempprice=0;
cout<<"Unesite sifru proizvoda:";
cin>>tempid;                        
cout<<"Unesite naziv proizvoda:";
cin>>tempname;  
cout<<"Unesite godinu proizvoda:";
cin>>tempyear;  
cout<<"Unesite cijenu proizvoda:";
cin>>tempprice;
cout<<"Unijeli ste : ID: "<<tempid<<", naziv: "<<tempname<<", godina: "<<tempyear<<", cijena: "<<tempprice<<",  hardware No: "

<<++counter;
hardware *temp;                         
temp = (hardware*)malloc(sizeof(hardware)); 
temp->id = tempid;  
temp->name = tempname;              
temp->year = tempyear;
temp->price = tempprice;
temp->next = head;                  
head = temp;
return 0;

編集 1: プログラムを実行すると、正常にコンパイルされます。構造 (ID、名前、価格、年など) を埋めるデータを入力した後、この行でプログラムが中断されます。

temp->name = tempname;

エラー出力は次のとおりです。

An unhandled exception of type 'System.AccessViolationException' occurred in proba.exe

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
4

3 に答える 3

2

コンストラクターが確実に呼び出されるようにするために、temp = new hardware;代わりに使用します。temp = (hardware*)malloc(sizeof(hardware));

于 2013-06-12T08:57:33.980 に答える
0

temp->nameは構築されないため、代入演算子の左側では使用できません。作成したと思われる場合は、作成したと思われるコード行を指してください。私はあなたができないに違いない。(メモリを割り当てましたが、そのメモリに文字列を構築したことはありません!)

于 2013-06-12T08:57:26.047 に答える
0

クラスの構築には、malloc() ではなく new() を使用してください。この場合、 std::string のコンストラクターは決して呼び出されません!

あなたが C++ の初心者であれば、当面は常に new/delete を使用し、malloc/free を使用しないことをお勧めします。

于 2013-06-12T09:01:25.730 に答える