アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

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

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

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

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

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

A 回答 (8件)

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

この回答への補足

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

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

とか

free(b);

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

補足日時:2010/02/05 18:39
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2010/02/06 14:53

memcpyもfreeも標準関数の仲間です。


これらの関数プロトタイプ宣言をしている
ヘッダーファイルをインクルードすればよいです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

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

お礼日時:2010/02/06 14:55

標準ヘッダーファイルは


#include <なんとか>

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

#include "かんとか"

と書けばいいです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2010/02/06 14:57

確かにむか~しは malloc.h とか memory.h とかのヘッダもあったんですが, どちらも今では (標準としては) 存在しません. malloc.h は stdlib.h に吸収されたのかな? memory.h は stdlib.h か string.h か, その辺のはずです.


どのようにして勉強されているのかわかりませんが, ひょっとして非常に古い書籍などを使っていませんか?
    • good
    • 0
この回答へのお礼

ありがとうございます。

むか~しの話をありがとうございます。書籍は『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

どのヘッダが必要になるかは、処理系等によっても


異なる場合があります。
関数自体の使い方が違う事もあるので、プログラム
を作る際には、使っている言語製品のマニュアルを
参照して確認する事が必須です。
#勘や想像だけでプログラムを作る事はできません。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

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

お礼日時:2010/02/06 15:04

こんにちは。



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

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

■テストソース
注)インデント等のため全角スペースを入れています。
  使用する際は、半角スペース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.
を、それぞれインクルードすれば良いと思います。

以上です。
    • good
    • 1
この回答へのお礼

ありがとうございます。

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

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

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

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

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

お礼日時:2010/02/06 15:11

>ヘッダファイルが置いてある場所とかでヘッダファイル


>を開いてみて確かめたりするべきだったのですね。

例えば 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等でもヘルプ等で確認
する事ができます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2010/02/07 22:25

えぇ!?


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

ありがとうございます。

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

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

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

お礼日時:2010/02/07 22:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!