質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

C++:ランタイムエラー・メンバ変数について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,568

saito.kaz

score 76

前提・実現したいこと

下記ソースコードを実行したところ、Runtimeエラーが発生して実行することができません。
staticの使い方が間違っているのでしょうか。
すいませんが、宜しくお願い致します。

プログラム

ヘッダー
class Worker{
    static int num;
    static char* CompanyName;
    int number;
    char* department;
    char* name;
    double salary;
public:    
    Worker();
    ~Worker();
    Worker(int number, char* department,char* name, double salary);
    void ShowData();
    void setNumber(int number);
    int getNumber();
    void setName(char* name);
    char* getName();
    void setSalary(double salary);
    double getSalary();

};
メイン文

include <iostream>

include <string.h>

include "Worker.h"

using namespace std;

int Worker::num=0;
char* Worker::CompanyName = "ABC";

Worker::Worker(){
    int number = num;
    strcpy(this->department, "NotDefinedDepartment");
    strcpy(this->name, "NotDefinedName");
    salary = 0;
    num++;
}

Worker::~Worker(){
    cout << "This is ~Worker();" << "\n";
}

Worker::Worker(int number, char* department,char* name, double salary){
    this->number = number;
    strcpy(this->department, department);
    strcpy(this->name, name);
    this->salary = salary;
}

void Worker::ShowData(){
    cout << "number = " << number << "\n";
    cout << "company = " << CompanyName << "\n";
    cout << "department = " << department << "\n";
    cout << "name = " << name << "\n";
    cout << "salary = " << salary << "\n";
}

void Worker::setNumber(int number){
    this->number = number;
}

int Worker::getNumber(){
    return this->number;
}

void  Worker::setName(char* name){
    strcpy(this->name, name); 
}

char* Worker::getName(){
    return this->name;
}

void  Worker::setSalary(double salary){
    this->salary = salary;
}

double  Worker::getSalary(){
   return this-> salary;
}

int main(void){
   Worker w1(1, "Adep", "Takayuki", 1233.0);
   w1.ShowData();

    return 0;
}

エラー

ここにご自身が実行したソースコードを書いてください

補足情報(言語/FW/ツール等のバージョンなど)

paiza.io

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

こんにちは。

Workerクラス内の下記2行が原因です。

   char* department; 
   char* name; 

これではchar型へのポインタを定義しただけです。
strcpy()しているので文字列をコピーしたいのだと思いますが、そのためには文字列を記憶できる領域(char型の配列)へのポインタとする必要があります。
そして、C/C++言語では例えば`int foo[10];'でint型の配列を定義した時、fooはfoo[10]先頭へのポインタになります。 従って、上記を例えば次のように書けば通ります。

   char department[100];     char name[100]; 

char name[100];は最大99文字の文字列を保存できます。文字数は適切な値を設定するのが良いです。 バッファオーバーフローに注意下さい。


因みにリファレンスをみて下記のように書くと通常はruntimeエラーになります。

char *name;
strcpy(name, "Cheironian");


C言語のFAQです。リファレンス通り書いたのに!!って感じた人が、たぶん何万人もいると思います。
strcpy()は第1引数が示すアドレスへ第2引数が示すアドレスからの文字列をコピーします。
char *name;と書いただけだとnameの値は不定ですね。なので、第一引数が示すアドレスは不定です。
たまたまそれが適切なアドレスにならない限り、不正なメモリへの書き込みとなるのです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

メイン分が書かれていないので推測ですが、

static char* CompanyName;

これだけではメモリ領域を確保していないことが原因ではないでしょうか?

static char CompanyName[(文字数)];
とか
プログラム開始から使用するまでの間に
Worker::CompanyName = new char[(文字数)]
とかすればランタイムエラーを回避できると思います

※Worker::CompanyName = new char[(文字数)]を使用した場合は
使い終わった後で
delete[] Worker::CompanyName
を忘れずに行ってください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/19 16:03

    申し訳ありません。
    メイン文を追加しました。

    キャンセル

  • 2016/01/19 16:55

    Chironianさんがおっしゃっている通り
    >char* department;
    >char* name;
    この2つのメモリ領域を確保していないのが原因ですね
    回避方法は静的に配列を宣言するか動的にメモリを確保するためにnewするかです

    キャンセル

  • 2016/01/20 01:34

    ご丁寧にありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る