2
gcc 4.7.2
c89

こんにちは、

文字列構造の要素である別のポインタにポインタを割り当てるこの関数があります。

この文字列構造の目的は、実際の文字列の長さを取得して設定することです。

しかし、なぜ彼らが三項演算子を使用したのか理解できません。それは私には意味がありません。以外の条件はないようですstr->len = src。これは、何も割り当てず、何も比較しません。

typedef struct tag_str_t str_t;
struct tag_str_t {
    char *buf;
    size_t len;
};

static void string_set(str_t *str, const char *src)
{
    str->buf = (char*)src;
    str->len = src ? strlen(src) : 0;
}

これを行うだけで、同じようにシンプルで読みやすくなりますか?

str->len = strlen(src);

提案をありがとう、

4

3 に答える 3

4

呼び出しstrlen(NULL)はセグメンテーション違反を生成します。そのコードは、src文字列がNULLの場合、長さはゼロであると単純に示します。そうでない場合は、を使用して長さを計算しstrlenます。

于 2013-01-16T07:32:11.963 に答える
4

コード:

str->len = src ? strlen(src) : 0;

次と同等です。

str->len = ((src != 0) ? strlen(src) : 0);

式のコンポーネントがどこにあるかを示すために、括弧と余分な式を追加しました。あなたのコメントは、三項演算子の条件だと思うことを示しているようですstr->len = srcが、それは間違っています。割り当ての優先順位は非常に低いです。

Jesus Ramos説明したように、テストの目的は がstrlen()NULL ポインターで呼び出されないようにすることであり、クラッシュにつながる可能性があります。

于 2013-01-16T07:34:52.953 に答える
1

三項演算子は、比較するためではなく、チェックするために使用されsrcます。NULLasを渡すとsrc、コードは を呼び出しUndefined Behaviorます。したがって、三項演算子は次のようにチェックします。

if( src != NULL )
    str->len = strlen(src) ; 
else
    str->len = 0 ;
于 2013-01-16T07:40:08.627 に答える