こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ヘッダファイル? malloc.hとかは自分で足したり作ったりできるのでしょうか

CmachineでC言語を勉強していて、メモリの確保までたどり着きました。

でも、プログラムを実行できないんです。調べたところ、malloc.hやmemory.hがCmachineのincludeフォルダに入っていませんでした。

char *b;
b = (char *)malloc(sizeof(char)*200);

とか書いても実行できませんよね・・・。Cmachineは勉強するのに便利だし、ヘッダファイルを追加できないのでしょうか。includeフォルダにテキストファイルで書いて入れればできそうなのですが。

ちなみに、Visual C++ Express Editionでも同じプログラムを実行したのですが、できませんでした。あれもヘッダファイルが無いとかの問題なのでしょうか。あれは操作が複雑で難しくてよくわかりません。

アドバイスやいい方法をご存知の方、教えてください!!

投稿日時 - 2010-02-05 17:47:57

QNo.5651516

すぐに回答ほしいです

質問者が選んだベストアンサー

こんにちは。

当方で、「C machine Version 2.02」をインストールして、下記のテストソースの
コンパイル&実行を行い、検証してみました。

※ちなみに、質問者さんが仰っている「Cmachine」というのが、下記サイトで
 配布されている、C言語開発環境のソフトのことだとした場合の話しとします。
http://web.archive.org/web/20021220170028/homepage1.nifty.com/kentake/index.html

■テストソース
注)インデント等のため全角スペースを入れています。
  使用する際は、半角スペースorタブに置換して下さい。
/////↓ここから///////////////
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  char *b;
  char a[] = "123";

  b = (char *)malloc(sizeof(char)*200);
  if(b==NULL){
    printf("memory allocation error.\n");
    return 1;
  }
  memcpy(b, a, sizeof(a));
  printf("a=%s\n", a);
  printf("b=%s\n", b);
  free(b);

  return 0;
}
/////↑ここまで///////////////

結果は、正常にコンパイル&実行され、以下の結果を得ることができました。

■実行結果
a=123
b=123

以上の結果から、質問者さんの環境でも、他の回答者の方々が言われている
ように、標準関数に対応した適切なヘッダファイルをインクルードすれば、正常に
コンパイル&実行できると思われます。

今回の場合は、
  malloc関数、free関数に対しては、 stdlib.h
  memcpy関数に対しては、       string.h.
を、それぞれインクルードすれば良いと思います。

以上です。

投稿日時 - 2010-02-06 14:16:21

お礼

ありがとうございます。

使用しているのは「C machine Version 2.02」です。FarEyesさんのテストソースで無事実行できました!!

だからmemcpyがCmachineで使えることが分かったので、私の本の記述とどこが違うかを調べたり、いろいろ試してみました。すると、<string.h>にmemcpyがあることが分かり、それをインクルードしてなかったことがわかりました。私の本では<string.h>はインクルードしていませんでした。

それから、私の本ではif(!b)という記載だったのですが、これをそのままやるとCmachineではエラーになり、if(b == NULL)という書き方にしなければならないこともわかりました。

また、全角スペースがあると実行できないことにびっくりしました!!

まだまだわからないことだらけですが頑張ります!!

投稿日時 - 2010-02-06 15:11:08

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

えぇ!?
し, 信じられない... そんな時期の本で, 平気で malloc.h とか memory.h とか使ってるだなんて....
「今の処理系」では malloc.h や memory.h は存在しません. varargs.h もありません. 本が書かれた当時ですら, そんなのが存在することを想定してはいけない.
その本には対象としている処理系は書かれていませんか? 書かれているなら, それ以外の処理系では使えないかもしれないと思ってください. もし書かれていないんだったら, 正直即座に捨てていいと思う.

投稿日時 - 2010-02-06 22:37:57

お礼

ありがとうございます。

malloc.hやmemory.hはかなり古いのですね(汗)

私の本ではVisual C++での説明が書いてました。Visual C++での学習を想定していたんですね、きっと。

本を読む時も対象としている処理系が何かをチェックする必要があることが分かりました。ありがとうございます!!

投稿日時 - 2010-02-07 22:27:16

ANo.7

>ヘッダファイルが置いてある場所とかでヘッダファイル
>を開いてみて確かめたりするべきだったのですね。

例えば Linuxでは、コンソール上で
$ man malloc
と入力すると以下の様に出力されます。

名前
calloc, malloc, free, realloc - 動的なメモリの割り当てと解放を行う

書式
#include <stdlib.h>

void *calloc(size_t nmemb, size_t size);
void *malloc(size_t size);
void free(void *ptr);
void *realloc(void *ptr, size_t size);
  以下略

上記から、必要なインクルードファイルや引数の型
使用方法等が確認できます。
Visual C++ Express Edition等でもヘルプ等で確認
する事ができます。

投稿日時 - 2010-02-06 15:31:02

お礼

ありがとうございます。

Linuxも使いますが、mallocについてもmanで説明がでるなんて初めて知りました。CだけでなくLinuxも面白くなってきました!!

投稿日時 - 2010-02-07 22:25:24

ANo.5

どのヘッダが必要になるかは、処理系等によっても
異なる場合があります。
関数自体の使い方が違う事もあるので、プログラム
を作る際には、使っている言語製品のマニュアルを
参照して確認する事が必須です。
#勘や想像だけでプログラムを作る事はできません。

投稿日時 - 2010-02-06 08:00:22

お礼

ありがとうございます。

どのヘッダが必要になるかが処理系によって異なるということは今回初めて知り、勉強になりました。

ヘッダファイルが置いてある場所とかでヘッダファイルを開いてみて確かめたりするべきだったのですね。

投稿日時 - 2010-02-06 15:04:01

ANo.4

確かにむか~しは malloc.h とか memory.h とかのヘッダもあったんですが, どちらも今では (標準としては) 存在しません. malloc.h は stdlib.h に吸収されたのかな? memory.h は stdlib.h か string.h か, その辺のはずです.
どのようにして勉強されているのかわかりませんが, ひょっとして非常に古い書籍などを使っていませんか?

投稿日時 - 2010-02-05 23:49:54

お礼

ありがとうございます。

むか~しの話をありがとうございます。書籍は『Cの絵本』2006初版16刷を使っています。

この本では今回のメモリ確保のプログラムで
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
をインクルードするように書いてありました。
malloc.hとmemory.hなんてないぞ!!とエラーが出るものでしたから困っていたのです。
Visual C++ Express Editionではこのままの記述で動きました。古いヘッダもあるんですね。さすが大手の開発環境です。

投稿日時 - 2010-02-06 15:02:23

ANo.3

標準ヘッダーファイルは
#include <なんとか>

と書けばいいですね。
それと同じように、自作のヘッダーファイルは

#include "かんとか"

と書けばいいです。

投稿日時 - 2010-02-05 21:30:53

お礼

ありがとうございます。

自作のヘッダーファイルも#include "かんとか" と書いて作れるのですね。でも、今回はCmachineにあるヘッダーファイルを開いて調べたところ必要なものが入っていることを確認しました。お騒がせしました。

投稿日時 - 2010-02-06 14:57:12

ANo.2

memcpyもfreeも標準関数の仲間です。
これらの関数プロトタイプ宣言をしている
ヘッダーファイルをインクルードすればよいです。

投稿日時 - 2010-02-05 21:20:23

お礼

ありがとうございます。

ヘッダーファイルを開いて確かめることをしていませんでした。そこまでするのは初めてで(汗)

本に書いてあるとおりに入力すれば動くものかと思っていたのが甘かったです。

投稿日時 - 2010-02-06 14:55:11

ANo.1

何か勘違いされているようですがmalloc関数を使いたいのであれば、インクルードするヘッダはstdlib.hですよ。

投稿日時 - 2010-02-05 18:15:42

補足

動かない原因を間違っていたかもしれません(汗)

memcpy(b, a, sizeof(char)*4);

とか

free(b);

なんて関数も使っているんです。これかもしれません。すみません。

投稿日時 - 2010-02-05 18:39:02

お礼

ありがとうございます。他の方の回答を含めていろいろ調べてみたら、Cmachineではインクルードフォルダの中のstdlib.hを開いてみたら、そこにmalloc関数がありました!!

インクルードするヘッダはstdlib.hですね。

投稿日時 - 2010-02-06 14:53:27

あなたにオススメの質問