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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2339閲覧

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

saito.kaz

総合スコア76

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/01/19 05:49

編集2016/01/19 07:05

###前提・実現したいこと
下記ソースコードを実行したところ、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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

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エラーになります。

C++

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

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

投稿2016/01/19 07:38

編集2016/01/19 07:50
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

static char* CompanyName;

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

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

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

投稿2016/01/19 07:00

kutsulog

総合スコア985

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saito.kaz

2016/01/19 07:03

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

2016/01/19 07:55

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

2016/01/19 16:34

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問