• ベストアンサー

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

CmachineでC言語を勉強していて、メモリの確保までたどり着きました。 でも、プログラムを実行できないんです。調べたところ、malloc.hやmemory.hがCmachineのincludeフォルダに入っていませんでした。 char *b; b = (char *)malloc(sizeof(char)*200); とか書いても実行できませんよね・・・。Cmachineは勉強するのに便利だし、ヘッダファイルを追加できないのでしょうか。includeフォルダにテキストファイルで書いて入れればできそうなのですが。 ちなみに、Visual C++ Express Editionでも同じプログラムを実行したのですが、できませんでした。あれもヘッダファイルが無いとかの問題なのでしょうか。あれは操作が複雑で難しくてよくわかりません。 アドバイスやいい方法をご存知の方、教えてください!!

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

  • ベストアンサー
noname#144013
noname#144013
回答No.6

こんにちは。 当方で、「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. を、それぞれインクルードすれば良いと思います。 以上です。

rabitwo
質問者

お礼

ありがとうございます。 使用しているのは「C machine Version 2.02」です。FarEyesさんのテストソースで無事実行できました!! だからmemcpyがCmachineで使えることが分かったので、私の本の記述とどこが違うかを調べたり、いろいろ試してみました。すると、<string.h>にmemcpyがあることが分かり、それをインクルードしてなかったことがわかりました。私の本では<string.h>はインクルードしていませんでした。 それから、私の本ではif(!b)という記載だったのですが、これをそのままやるとCmachineではエラーになり、if(b == NULL)という書き方にしなければならないこともわかりました。 また、全角スペースがあると実行できないことにびっくりしました!! まだまだわからないことだらけですが頑張ります!!

その他の回答 (7)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.8

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

rabitwo
質問者

お礼

ありがとうございます。 malloc.hやmemory.hはかなり古いのですね(汗) 私の本ではVisual C++での説明が書いてました。Visual C++での学習を想定していたんですね、きっと。 本を読む時も対象としている処理系が何かをチェックする必要があることが分かりました。ありがとうございます!!

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.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等でもヘルプ等で確認 する事ができます。

rabitwo
質問者

お礼

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

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.5

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

rabitwo
質問者

お礼

ありがとうございます。 どのヘッダが必要になるかが処理系によって異なるということは今回初めて知り、勉強になりました。 ヘッダファイルが置いてある場所とかでヘッダファイルを開いてみて確かめたりするべきだったのですね。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

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

rabitwo
質問者

お礼

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

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

標準ヘッダーファイルは #include <なんとか> と書けばいいですね。 それと同じように、自作のヘッダーファイルは #include "かんとか" と書けばいいです。

rabitwo
質問者

お礼

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

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

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

rabitwo
質問者

お礼

ありがとうございます。 ヘッダーファイルを開いて確かめることをしていませんでした。そこまでするのは初めてで(汗) 本に書いてあるとおりに入力すれば動くものかと思っていたのが甘かったです。

回答No.1

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

rabitwo
質問者

お礼

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

rabitwo
質問者

補足

動かない原因を間違っていたかもしれません(汗) memcpy(b, a, sizeof(char)*4); とか free(b); なんて関数も使っているんです。これかもしれません。すみません。

関連するQ&A

  • セグメンテーション違反とmalloc

    char *name この宣言でプログラムの組初めはこれでいけたのですが char *name = (char *)malloc(sizeof(char) * 10); 後からこのようにmallocで動的メモリ確保しないとセグメンテーション違反が起きるようになりました。 なぜこうなるのでしょうか? それとmallocの使うタイミング(どういう時)に使えばよいのでしょうか?

  • #include <Windows.h>というヘッダファイルについて

    お早う御座います。 Cの初心者です、宜しくお願いします。 「#include <Windows.h>」というヘッダファイルはどのようなプログラムを書いたときにincludeしてやる必要があるのでしょうか。 宜しくお願いします。

  • mallocについて

    mallocについて 現在C言語でプログラムをかいているのですが、原因不明のエラーが出て困っています。 それはmallocによる動的メモリ確保を行ったとき、 (float *)malloc(sizeof(float)*200)の場合大丈夫ですが、 (float *)malloc(sizeof(float)*320)ではエラーが出てしまうのです。 しかし (float **)malloc(sizeof(float*)*640)とした場合エラーは出ませんでした。 これは何が原因でエラーが出ているのでしょうか? ちなみにコンパイルはできており、実行したとき プログラム名(7637) malloc: *** error for object 0x100ff7a08: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug というエラーがでます。

  • mallocがうまく動かない

    コマンドライン引数で指定された文字列を逆順に返すプログラムを作るため 下記のようなプログラムを組みました。 ところが変数strの大きさがargv[1]より大きくなってしまいます。 どうすればよいのでしょうか。 #include <stdio.h> #include <stdlib.h> char *mstrrev (char *s); int main(int argc, char *argv[]){ char *str; str = mstrrev(*(argv+1)); printf("%s",str); free(str); } char *mstrrev (char *s){ int length,i; char *str; for(length=0;*(s+length)!='\0';length++); str = (char *)malloc(sizeof(char)*length); for(i=0;i<length;i++){ str[i] = s[length-1-i]; } return str; }

  • メモリ操作関数『malloc(),free()』

    /*10バイトのメモリ領域を確保し、その領域に文字列"Allocate"を代入せよ。*/ /*ただし、確保した領域は、プログラム終了までに開放すること。*/ #include<stdio.h> #include<stdlib.h> void main(void) { char *ptr; ptr = (char *)malloc(10); printf("Allocate\n"); free(ptr); } 今、ライブラリ関数を勉強しています。 この問題をとりあえず作ってみて、実行も成功したのですが、10バイトのメモリ確保の数値を変えても、何も変わらないため本当に問題の要求どおりのプログラムが作れているのか謎です。 間違っているなどのアドバイス宜しくお願いします。

  • 2つのvoid関数でmallocを使うと2step目でセグメントエラーが出る

    プログラムのmainを見やすくするためにサブルーチンとしてvoid関数を使っているのですが、その中でmallocでメモリを確保して配列を作ろうとするとエラーが出てしまいます。概略を書くと #include <stdio.h> #include <math.h> #include <stdlib.h> //voidの宣言 void a(double* ,double*, double,); void b(double* ,double*, double,); main(){ double *c,*d,e; double *f,*g,h; c=(double *)malloc(sizeof(double)*N) //Nは適当な整数です d,f,gも同様の処理 色々な作業 while(適当回数繰り返します){ a(c,d,e); b(f,g,h); 色々な作業 } } void a (double* c, double* d, double e){ double **i,*j,; int k; i=(double **)malloc(sizeof(double *)*M) //Mは適当な整数です for(k=0;k<=M;k++){ i[k]=(double *)malloc(sizeof(double)*M) //Mは適当な整数です } jも同様にメモリ確保 様々な作業(逆行列の計算など) } void bはaとほとんど同じです。 mallocで二次元配列や配列を作っています。勿論同じ文字は使っていません。 以上のようなプログラムでgccは通ります。でも実行するとwhile内での1step目は上手くいくのですが、2step目のb内での始めの(double *)malloc(sizeof(double)*L)(Lは適当な整数です)で、つまりメモリ確保でセグメントエラーが出ます。両者とも片方を削るとエラーは出ません。1step目は何故上手くいくのか、2ステップ目で何故ダメなのかが分かりません。皆様の御教授をお願いします。

  • 自作したヘッダファイルをインクルードするには

    自作したヘッダファイルをインクルードするには 自作したヘッダファイルを半角スペースを含むフォルダを指定する時、 何かエスケープシーケンス文字が必要でしたでしょうか?ド忘れしてしまいました… 例えば、Program Filesの直下に入れた自作ヘッダファイルa.h(まず考えられないとは思いますが…)を インクルードしたい時、 #include "C:\\Program Files\\a.h" でいいんですよね?

  • C言語 mallocによる消費メモリ

    char *b = (char *)malloc(sizeof(char) * 6) というC言語のプログラムで、消費されるメモリは何バイトになるのでしょうか?理由も合わせて教えていただきたいです。 32ビットのPCで行うものとしてよろしくお願いいたします。

  • mallocについて

    vine linux 3.0上でgccを使い下記のようなプログラム(読みにくいプログラムで申し訳ありません)を作成してみました。無事コンパイルも通りメモリも確保出来ました。 しかし、このプログラムを2つ起動しそれぞれでメモリを確保するとおかしな事が起きるのです。どういう症状かと言うとプログラム1もプログラム2も同じ先頭アドレスを確保しているのです。 例) プログラム1 keep memory size : 11 address : 0x8049700 プログラム2 keep memory size : 11 address : 0x8049700 なぜこのような事が起こるのでしょうか? ご教授宜しくお願いします。 #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { int size; unsigned int *p; char buf; size = atoi(argv[1]); printf("keep memory size : %d\n", size); p = (unsigned int *)malloc(size); printf("address : %p\n", p); scanf("%c", &buf); free(p); }

  • C言語 動的なメモリの確保 実行できない

    malloc関数を使いメモリを確保しそこへ"ABCD"と記憶させ、ポインタ*Cを使い確保したメモリの内容を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) {   int i;   char *C;   C = (char *) malloc (sizeof(char) * 5);   C = "ABCD";   for(i = 0; i < 5; i++){     if(C[i] != NULL){       printf("%s", C[i]);    ←※エラー※     }   }   free(C);   return 0; } ********************************************* 正常にコンパイルできますが実行エラーになります。VCを使いF10のデバッグテストで※のところエラーになります。なぜなのでしょうか?

専門家に質問してみよう