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);
非常感谢任何建议,
答案 0 :(得分:4)
调用strlen(NULL)
将生成段错误,该代码只是说src字符串是否为NULL,长度为零,如果不使用strlen
计算长度。
答案 1 :(得分:4)
代码:
str->len = src ? strlen(src) : 0;
相当于:
str->len = ((src != 0) ? strlen(src) : 0);
我添加了括号和额外的表达式来指示表达式的组成部分。您的评论似乎表明您认为str->len = src
是三元运算符中的条件,但这是错误的;赋值的优先级非常低。
由于Jesus Ramos也是explained,测试的目的是确保不使用NULL指针调用strlen()
,这会导致崩溃。
答案 2 :(得分:1)
在那里使用三元运算符不进行比较,而是检查src
。假设您将NULL
作为src
传递,则代码将调用Undefined Behavior
。因此,三元运算符检查为:
if( src != NULL )
str->len = strlen(src) ;
else
str->len = 0 ;