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 回答