C言語使用中の個人メモ
-
自分は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"));
} -
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; }
-
pointer型変数が出たら、設定(SET)時にチェックを忘れないこと。
①該当変数はメモリalloc済んだか?(ちゃんと内容を入れる空間があるか?)
②該当変数は使用後どこでfreeしたのか?(leakはしてないよね?)
③=を使用してないよね(memcpyじゃないと値が中身反映されないよ)
④どうしても=&変数の場合、変数の作用域をチェック!(作用域超えたらメモリは回収されて消えちゃうよ)ついつい忘れちゃうよな・・
-
C言語の中のローカル変数が、
初期化されていない状態だと、値は不確定です(0ではない)。
初期化されていない状態での読み込みを操作しないように!
特にpointer型、NULLじゃなくてもfreeしないで(プログラムがしんちゃう。。。)文字列は最後「0」に入れると、きれいにprintできる。
strlen()にも0の前の長さで出る。
(特にchar *を要注意、最後が0じゃないとstrlen()算出したlengthは不正確になる)