はストリングなく、割り当てに関連するメモリの量の長を報告します。
strlen
関数は、終了ヌル文字に先行する文字数を返します。 3
C11dr§7.24.6.3はOPコードに変更を考えます。
char* binStr = "00000101";
printf("Result of strlen(binStr) %d\n", (int) strlen(binStr));
// Expect 8 to be printed.
char* b64str = (char*)malloc((strlen(binStr)+1)*sizeof(char));
strcpy(b64str, "123");
printf("Result of strlen(b64str) %d\n", (int) strlen(b64str));
// Expect 3 to be printed.
strcpy(b64str, "12345");
printf("Result of strlen(b64str) %d\n", (int) strlen(b64str));
// Expect 5 to be printed.
もstrcpy(b64str, "123");
size_t sz = strlen(binStr)+1)*sizeof(char);
printf("Allocation size %d\n", (int) sz);
// Expect 9 to be printed.
後に標準的な方法はありません割り当てられたメモリの量がb64str
によって指さこと9.注たこれら印刷割り当てサイズが9ままのなしmalloc()
から返された非NULL
ポインターに関連付けられたメモリーの量を判別します。
malloc
コードが割り当てが成功したかどうかを知るためにmalloc()
の戻り値をチェックしませんでしたchar*
(OP)のためのメモリを割り当てません。 NULL
のチェックを行います。コードが非NULL
を受け取った場合、割り当てに成功しました。 NULL
の戻り値は、サイズ要求が0の場合でもOKですが、strlen(binStr)+1
では問題ありません。
malloc関数は、ヌルポインタまたは割り当てられた領域へのポインタを返します。 §7.22.3.42
char* b64str = malloc(strlen(binStr)+1);
if (b64str == NULL) {
perror("OOM"); exit(-1);
}
注:
キャストmalloc()
リターンを必要としません。
sizeof(char)
タイプsize_t
を一致させるために使用"%zu"
char* b64str = malloc(strlen(binStr)+1);
if (b64str == NULL) { perror("OOM"); exit(-1); }
常に1
堅牢なコードをチェック割り当て結果であるあなたは、その値を期待する理由を記入してくださいstrlen()
printf("Result of strlen() %zu\n", strlen(b64str));
から返されました。ドキュメンテーションと標準への言及とベスト。 – Olaf
'b64str'は、新たに割り当てられたメモリを指します。あなたのシステムでは、その特定の実行で、メモリには最初にNUL文字が含まれています。何かを保存する前に実際にメモリにアクセスすべきではありません。Valgrindは、もしあなたがそれを使用するなら、このエラーを特定します。 –