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

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

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

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

Q&A

解決済

2回答

1054閲覧

引数のポインタにmallocしたアドレスを返したい。

ryusei_12

総合スコア11

C

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

0グッド

0クリップ

投稿2020/02/29 03:04

わからないことがあったので、質問させて下さい。

今、ある文字とある文字を連結させてそれを出力引数で返す。
という関数を作成しています。
その他、細かい内容は省略にしますが、うまく行きません。
とりあえず、以下にコードを載せます。

#include <stdio.h> #include <stdlib.h> //malloc #include <string.h> //strcpy #include <stdint.h> #define SUCCESS (0) #define ERROR (-1) #define EMPITY (-1) #define INPUT_MOJI (255) #define STRA (argv[1]) #define STRB (argv[2]) int8_t catstr(char *strA, char *strB, char *outstr); int8_t isEmpty(char *s); char *malloc_func(int16_t get_length); int main(int argc, char *argv[]){ char a[INT8_MAX]; char b[INT8_MAX]; char *c; int8_t result_value; uint8_t strA_len, strB_len; if (argc != 3) { fprintf(stderr, "引数がおかしいです。\n"); return ERROR; } strA_len = strlen(STRA); strB_len = strlen(STRB); if ((strA_len > UINT8_MAX) || (strB_len > UINT8_MAX)) { fprintf(stderr, "文字数が多すぎます。"); return ERROR; } strcpy(a,STRA); strcpy(b,STRB); result_value = catstr(a, b, c); if (result_value != ERROR) { printf("after pointer add->(main) %p\n", c); //0x7f2117f761ef printf("%s\n", c); } free_func(c); printf("返り値->%d\n", result_value); return SUCCESS; } //文字列AとBを連結する。 int8_t catstr(char *strA, char *strB, char *outstr){ int8_t len_A; int8_t len_B; int16_t total_length; if ((isEmpty(strA) == EMPITY) || (isEmpty(strB) == EMPITY)) { fprintf(stderr, "文字が入力されていません。"); return ERROR; } len_A = (int8_t)strlen(strA); len_B = (int8_t)strlen(strB); total_length = len_A + len_B + 1; //+1 は終端も自分を追加 outstr = malloc_func(total_length); if (outstr == NULL) { fprintf(stderr, "メモリを確保できませんでした。"); return ERROR; } printf("after Dummy argument %p\n", outstr); //0x55ee1e5d7260 if ((strB[0] >= '0') && (strB[0] <= '9')) { strcpy(outstr, strB); strcat(outstr, strA); } else { strcpy(outstr, strA); strcat(outstr, strB); } printf("malloc_func_%p\n",outstr); //0x55ee1e5d7260 return SUCCESS; } int8_t isEmpty(char *s){ if (s == NULL || strlen(s) == 0) { return EMPITY; } else { return SUCCESS; } } char *malloc_func(int16_t get_length){ //lengthが0以下だった場合 if ( get_length < 0) { fprintf(stderr, "確保するメモリの数がおかしいです。"); return NULL; } char *array; array = malloc(sizeof(char) * get_length); if (array == NULL) { fprintf(stderr, "メモリ不足です。"); return NULL; }; printf("malloc_func address %p\n", array); //0x55ee1e5d7260 return array; }

以上が、malloc部分のコードとそれを呼び出すコードとmain関数になります。
自分がうまく出来なかったのは、以下のことです。

######質問
・catstr関数内では、きちんとmalloc_func関数を呼び出して、メモリの動的確保ができているのですが、
それを次にmain関数に引数で返したら、確保したメモリの場所を記憶出来ていませんでした。
どのようにコードをかけば、これは解決できますか?、、、

######補足
・catstrの引数をポインタのポインタにした場合には出来ました。
それ以外の方法でお願いしたいです。

以上です、
どなたかよろしくお願いします。

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

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

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

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

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

coco_bauer

2020/02/29 04:35

何故、「catstrの引数をポインタのポインタ」以外の方法でなければならないのですか? asmさんがコメントされているように、C言語には参照渡しがないので、引数を介する場合にはポインタのポインタにならざるを得ないと思うのですが。
guest

回答2

0

ベストアンサー

それ以外の方法でお願いしたいです。

関数から呼び出し側に値を返すのは、
・返り値(return)
・引数
・グローバル変数
しかないので、引数で返すのがだめなら、返り値か、グローバル変数経由で返すしかないです。

グローバル変数を使うのが妥当なケースはレアです。

投稿2020/02/29 03:53

otn

総合スコア84555

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

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

0

catstr内のoutstrを全て*outstrで一括置換し
main関数内のcatstr呼び出し時に&cを渡せば大丈夫でしょう

投稿2020/02/29 03:13

asm

総合スコア15147

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

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

asm

2020/02/29 03:23

C言語には参照渡しがないので - ポインタのポインタ - 関数の返り値 を使うしかないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問