i-focus i-focus BB
    • カテゴリ
    • 最近
    • タグ
    • 人気
    • ユーザー
    • グループ
    • 登録
    • ログイン

    C言語使用中の個人メモ

    C言語
    1
    4
    502
    もっと見る
    • 古いものから新しい順
    • 新しいものから古い順
    • 最高評価
    返信
    • スレッドとして返信する
    投稿するのにログインして下さい
    このスレッドが削除されました。スレッド管理権を持っているユーザーにしか読めません。
    • M
      misi.tang
      最後に編集した時間

      自分はC言語、大学の時ちゃんと勉強してたつもりですが、ほぼ10年たってた今、忘れたことが多く、もしくは最初から触れていない知識(実践的にあまり使ってないため)もあるため、わからないことがすごく多いと感じております。
      そんな初心者同様な私が、これからコーディングしていくうちの問題点と対策をメモしようと思っています。
      他の人にも役に立てると幸いです。

      随時更新します。
      ーーーーーーーーーーーーーーーーーーーーーーー

      1.char[] arrayを別のpointer char *変数に渡したあと、
      char chararr[10] = "test";
      char *charp = chararr; // &は不要、array自体がアドレス
      printf("%s", charp) → はエラーになる
      正解は
      printf("%s", (char *)charp);

      2.関数を戻り値にしたい時
      ①戻り値の関数を声明(&実装)
      int testDummyCommandExecute(char *parameters);
      ②戻り値の関数型を定義
      typedef int(*execute_func)(char *);
      ③関数を戻り値にする関数を声明(&実装)
      execute_func testReturnFunc()
      {
      return testDummyCommandExecute;
      }
      ④実際に使用
      int main()
      {
      int(*func1)(char *) = testReturnFunc();
      printf("func1=%d", func1("test"));
      }

      1 件の返信 最後の返信 返信 引用 0
      • M
        misi.tang
        最後に編集した時間

        2の補足、もう一つの形態:
        ①戻り値の関数型を定義

        typedef IFCS_SMS_CMD_RETURN_E(*SMS_COMMAND_EXECUTE_FUNC_ENTRY)(char *);
        

        ※該当型はstructの中でも利用できる

        typedef struct
        {
            uint8*                command_name;
            SMS_COMMAND_EXECUTE_FUNC_ENTRY execute_func;
            char                  *execute_params;
        } IFCS_SMS_CMD_T;
        

        ②戻り値の関数を声明(&実装)

        IFCS_SMS_CMD_RETURN_E testDummyCommandExecute(char *parameters);
        

        ③関数を戻り値にする関数を声明(&実装)

        SMS_COMMAND_EXECUTE_FUNC_ENTRY testReturnFunc()
        {
        	return testDummyCommandExecute;
        }
        

        ④実際に使用

        int main()
        {
            SMS_COMMAND_EXECUTE_FUNC_ENTRY func1 = testReturnFunc();
            printf("func1=%d", func1("test"));
            return 0;
        }
        
        1 件の返信 最後の返信 返信 引用 0
        • M
          misi.tang
          最後に編集した時間

          pointer型変数が出たら、設定(SET)時にチェックを忘れないこと。
          ①該当変数はメモリalloc済んだか?(ちゃんと内容を入れる空間があるか?)
          ②該当変数は使用後どこでfreeしたのか?(leakはしてないよね?)
          ③=を使用してないよね(memcpyじゃないと値が中身反映されないよ)
          ④どうしても=&変数の場合、変数の作用域をチェック!(作用域超えたらメモリは回収されて消えちゃうよ)

          ついつい忘れちゃうよな・・😢

          1 件の返信 最後の返信 返信 引用 0
          • M
            misi.tang
            最後に編集した時間

            C言語の中のローカル変数が、
            初期化されていない状態だと、値は不確定です(0ではない)。
            初期化されていない状態での読み込みを操作しないように!
            特にpointer型、NULLじゃなくてもfreeしないで(プログラムがしんちゃう。。。)

            文字列は最後「0」に入れると、きれいにprintできる。
            strlen()にも0の前の長さで出る。
            (特にchar *を要注意、最後が0じゃないとstrlen()算出したlengthは不正確になる)

            1 件の返信 最後の返信 返信 引用 1
            • First post
              Last post