わからないことがあったので、質問させて下さい。
今、ある文字とある文字を連結させてそれを出力引数で返す。
という関数を作成しています。
その他、細かい内容は省略にしますが、うまく行きません。
とりあえず、以下にコードを載せます。
#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の引数をポインタのポインタにした場合には出来ました。
それ以外の方法でお願いしたいです。
以上です、
どなたかよろしくお願いします。
回答2件
あなたの回答
tips
プレビュー