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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

483閲覧

mallocについて

ryusei_12

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/02/26 15:36

前提・実現したいこと

どなたか教えて下さい。
現在、自分はC言語の勉強を行っています。
mallocを使用している際につまずいたので、教えていただきたく質問させていただきました。

mallocをメモリ確保の関数を別で定義して、使用する場合に、
reutrn で確保したアドレスを返すというのは理解できました。

今回は、そうではなく、引数で返したりはできないのか?考え
質問しました。

例えば以下のようなコードのイメージです。(適当ですみません。。)

該当のソースコード

#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #define SUCCESS (0) #define ERROR (-1) int malloc_func(char *p, int get_length); int main(){ char *p; int get_length = 128; int ret; //printf(main adress %p\n,&p);  ここ ret = malloc_func(p,get_length); return 0; } int malloc_func(char *p, int get_length){ //printf(main adress %p\n,&p); ここ char *array; array = malloc(sizeof(char) * get_length); if (array == NULL) { fprintf(stderr,"メモリ不足です。"); return ERROR; }; p = array; return SUCCESS; }

質問したいこと
・確保したアドレスを戻り値ではなく、引数で返すことは可能か?
【追加】
・引数にポインタを渡したら、実引数と仮引数は同じものがくると考えていたのですが、違うのですか?コメントアウトしている部分です。

以上です。
どなたか回答いただけると助かります。
お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

例えば、intを引数で返したい場合は、intのポインタであるint*を渡しますよね。
同様にchar*を引数で返したい場合は、char*のポインタであるchar**を渡さないといけないです。

投稿2020/02/26 15:44

segavvy

総合スコア1038

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

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

ryusei_12

2020/02/26 15:55

回答ありがとうございます。 そうですよね。。。渡すのはポインタのポインタになりますよね。 このように引数でmallocってあまりしないんですか? 自分は最近、「関数内を見た感じでは1次元配列用のメモリしか確保していないので、用途がわかりません。」と言われたのですが、、、
segavvy

2020/02/26 16:57

もう何年もCでの開発はしていなので、最近の言語仕様やスタイルの流行りはわからないのですが、やはり目的次第だと思います。 引数で結果のポインタを受け取れるようにすれば、戻り値は別の用途に使えます。例えば関数内部で起きるエラーにバリエーションがある場合に、エラー番号を返すことができます。 ただし、mallocと全く同じものを作るのであれば、returnで返した方が良いでしょう。似たようなものを別の形で作ると、使う方が勘違いしてしまう恐れがあるためです。
ryusei_12

2020/02/29 02:49

返信遅れてすみません。 そうですよね。。。。 回答ありがとうございます。 参考にコードを修正します。 また困ったときは、利用するので、よろしくお願いします。
guest

0

要約しますと、ポインタは、「このメモリ領域を見てね」という情報を表す変数で、関数に渡した場合、その情報がコピーされます。関数の中から、元のポインタが指している、注目するメモリ領域にはアクセスできますが、元のポインタ変数そのものにアクセスすることはできません。もしポインタ変数にアクセスしたければ、「このポインタ変数があるメモリ領域を見てね」としてあげなければいけないのです。

投稿2020/02/26 15:54

majiponi

総合スコア1722

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問