CmachineでC言語を勉強していて、メモリの確保までたどり着きました。
でも、プログラムを実行できないんです。調べたところ、malloc.hやmemory.hがCmachineのincludeフォルダに入っていませんでした。
char *b;
b = (char *)malloc(sizeof(char)*200);
とか書いても実行できませんよね・・・。Cmachineは勉強するのに便利だし、ヘッダファイルを追加できないのでしょうか。includeフォルダにテキストファイルで書いて入れればできそうなのですが。
ちなみに、Visual C++ Express Editionでも同じプログラムを実行したのですが、できませんでした。あれもヘッダファイルが無いとかの問題なのでしょうか。あれは操作が複雑で難しくてよくわかりません。
アドバイスやいい方法をご存知の方、教えてください!!
No.6ベストアンサー
- 回答日時:
こんにちは。
当方で、「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.
を、それぞれインクルードすれば良いと思います。
以上です。
ありがとうございます。
使用しているのは「C machine Version 2.02」です。FarEyesさんのテストソースで無事実行できました!!
だからmemcpyがCmachineで使えることが分かったので、私の本の記述とどこが違うかを調べたり、いろいろ試してみました。すると、<string.h>にmemcpyがあることが分かり、それをインクルードしてなかったことがわかりました。私の本では<string.h>はインクルードしていませんでした。
それから、私の本ではif(!b)という記載だったのですが、これをそのままやるとCmachineではエラーになり、if(b == NULL)という書き方にしなければならないこともわかりました。
また、全角スペースがあると実行できないことにびっくりしました!!
まだまだわからないことだらけですが頑張ります!!
No.8
- 回答日時:
えぇ!?
し, 信じられない... そんな時期の本で, 平気で malloc.h とか memory.h とか使ってるだなんて....
「今の処理系」では malloc.h や memory.h は存在しません. varargs.h もありません. 本が書かれた当時ですら, そんなのが存在することを想定してはいけない.
その本には対象としている処理系は書かれていませんか? 書かれているなら, それ以外の処理系では使えないかもしれないと思ってください. もし書かれていないんだったら, 正直即座に捨てていいと思う.
ありがとうございます。
malloc.hやmemory.hはかなり古いのですね(汗)
私の本ではVisual C++での説明が書いてました。Visual C++での学習を想定していたんですね、きっと。
本を読む時も対象としている処理系が何かをチェックする必要があることが分かりました。ありがとうございます!!
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等でもヘルプ等で確認
する事ができます。
ありがとうございます。
Linuxも使いますが、mallocについてもmanで説明がでるなんて初めて知りました。CだけでなくLinuxも面白くなってきました!!
No.5
- 回答日時:
どのヘッダが必要になるかは、処理系等によっても
異なる場合があります。
関数自体の使い方が違う事もあるので、プログラム
を作る際には、使っている言語製品のマニュアルを
参照して確認する事が必須です。
#勘や想像だけでプログラムを作る事はできません。
ありがとうございます。
どのヘッダが必要になるかが処理系によって異なるということは今回初めて知り、勉強になりました。
ヘッダファイルが置いてある場所とかでヘッダファイルを開いてみて確かめたりするべきだったのですね。
No.4
- 回答日時:
確かにむか~しは malloc.h とか memory.h とかのヘッダもあったんですが, どちらも今では (標準としては) 存在しません. malloc.h は stdlib.h に吸収されたのかな? memory.h は stdlib.h か string.h か, その辺のはずです.
どのようにして勉強されているのかわかりませんが, ひょっとして非常に古い書籍などを使っていませんか?
ありがとうございます。
むか~しの話をありがとうございます。書籍は『Cの絵本』2006初版16刷を使っています。
この本では今回のメモリ確保のプログラムで
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
をインクルードするように書いてありました。
malloc.hとmemory.hなんてないぞ!!とエラーが出るものでしたから困っていたのです。
Visual C++ Express Editionではこのままの記述で動きました。古いヘッダもあるんですね。さすが大手の開発環境です。
No.1
- 回答日時:
何か勘違いされているようですがmalloc関数を使いたいのであれば、インクルードするヘッダはstdlib.hですよ。
この回答への補足
動かない原因を間違っていたかもしれません(汗)
memcpy(b, a, sizeof(char)*4);
とか
free(b);
なんて関数も使っているんです。これかもしれません。すみません。
ありがとうございます。他の方の回答を含めていろいろ調べてみたら、Cmachineではインクルードフォルダの中のstdlib.hを開いてみたら、そこにmalloc関数がありました!!
インクルードするヘッダはstdlib.hですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語について コマンドラインで >変数 12.00 (char型) と、小数点付きの値を共用体に渡 1 2022/04/22 16:56
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
なんかC言語でプログラム書いて...
-
MACで動く実行ファイルをWindow...
-
VB上で実行中の無限ループの止め方
-
他のPC上にあるexeを、そのP...
-
ExcelのVBAでX=0〜1の定積分を...
-
プログラミング ソースコード
-
DPマッチングのプログラミング
-
プリントスクリーンをプログラ...
-
並列計算をしたときのシステム...
-
秒数を数える(C言語)
-
C++でCtrl+Cを無効化したい
-
C#.net FTPでホームディレクト...
-
アクセス[ファイルを開かずに、...
-
C言語 fork()について
-
Visual Studio デバッグ実行で...
-
ヘッダファイル? malloc.hと...
-
clock関数は正確じゃないの?
-
実行時エラー429
-
システム資源とは?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Macターミナルで実行中のプログ...
-
なんかC言語でプログラム書いて...
-
プログラミング ソースコード
-
MACで動く実行ファイルをWindow...
-
実行時エラー429
-
Windows10でDOSゲーム
-
VB上で実行中の無限ループの止め方
-
他のPC上にあるexeを、そのP...
-
sendkeysにてALT+CTRL+INSERTを...
-
VBAで外部プログラムを非表示で...
-
システム資源とは?
-
プロセス間通信について
-
アクセス[ファイルを開かずに、...
-
C言語でプログラムを再起動
-
C言語で途中までしか、プログラ...
-
system関数を使用してsuコマン...
-
終了してもプログラムが実行し...
-
PIC のデータEEPROMに書き込み...
-
実行中の実行ファイルの上書き
-
他の実行ファイルを実行するプ...
おすすめ情報