-8

2人のワーカーの名前を出力するコードを作成しましたが、代わりにガベージを出力します。

cout << "highest salary: " << highestSalary.getID() << " " << highestSalary.getName() << endl;

cout << "hardest worker: " << mostHours.getID() << " " << mostHours.getName();

関数getName()は、ワーカークラスで次のように定義されています。

char* Worker::getName()
{
    char temp[20];

    int i;
    strcpy(temp, name);

    return temp;
}

デバッガーでこれを実行して、highestSalary.getName()の値をver char * temp内に入れてみました。値は予想どおりで、「bob」としましょう。ただし、coutの後の値は「」でcoutです。印刷されたゴミ。

4

2 に答える 2

8

いいえいいえいいえ、ローカル関数変数へのポインタを返しています。それがクラッシュする理由です。

代わりにこれを行ってください:

std::string Worker::getName()
{
   std::string temp(name); // not sure what type of name is...
   return temp;
}

することを忘れないでください#include<string>

これで、Cとポインターではなく、実際のC++ができました。

于 2013-03-10T13:11:19.527 に答える
1

ローカル変数へのポインタを渡しています。関数が終了すると、この変数はなくなります。

これがC++の場合は、文字列クラスを使用する必要があります。何らかの理由であなたがそうしない場合は、少なくともconstは正しいです:

const char* Worker::getName() const 
{
    return name;
}
于 2013-03-10T13:14:38.250 に答える