在C语言中,(char*)是什么意思?

6

我正在观看一个示例,看到了以下内容:

char *str;

/* ... */

if (!str || !*str) {
    return str;
}

这是什么意思?是空的还是其他什么情况?

3
在C语言中,!x 等价于 x == 0,始终如一。 - M.M
1
这是一个检查,用于确定str是否指向任何内容以及该内容是否不是空字符的过程。 - dtech
我以前见过这个例子。这段代码来自子程序 char* segfault_maybe(void) - geometrian
@imallett 我明白了。我猜测 OP 只是提供了 char *str; 来展示 str 的原始定义,在“真实代码”中有一些其他的东西。 - M.M
抱歉我的char *str。是的,我只想展示str是一个普通字符串。实际代码中有些其他内容。 - PTN
@MattMcNabb,PTN,我也是这么想的。通常我会写类似于char* str = /*something*/;这样的代码来防止像我这样的吹毛求疵的人。 - geometrian
4个回答

6

str是一个char指针。 !对其取反。基本上,当str == NULL时,!str将评估为true(1)。

第二部分的意思是,(如果str指向某些东西),则在第一个字符是空字符('\0')时评估为true(1)-这意味着它是一个空字符串。

注意:
*str解除引用指针并检索第一个字符。这与执行str [0]相同。


1
!将其转换为布尔值,然后取反该布尔值。 - Potatoswatter
你的意思是 str == NULL,而不是 *str == NULL。而且 *str 是一个字符,不是一个指针。 - M.M
@MattMcNabb 是的,我的错误。 - pushkin
@Pushkin,“char指针”和“char”是不同的。str是一个char指针,*str是一个char。 - M.M
@MattMcNabb 当然。那很傻。当我写它时,*str并不意味着解引用指针,而是char *str。我表达不清楚。 - pushkin
@Potatoswatter:如果操作数等于0,则返回1,否则返回0。结果的类型为int - Keith Thompson

4

!str的意思是字符串str没有分配内存。 !*str的意思是str指向一个空字符串。


1
@Potatoswatter 在您的最后一个表达式中评估str将导致未定义行为,因此!str无意义。 换句话说,如果在没有触发UB的情况下评估!str,则等效于测试str是否指向分配的内存(或超出末尾)。 - M.M
@MattMcNabb,你能告诉我UB是什么意思吗?我不知道这个缩写。 - Ely
@Potatoswatter 请参考C99 6.2.4/2和6.2.6.1/5。更多讨论请点击此处 - M.M
1
@MattMcNabb 谢谢。实际上,一个实现可以将 free 实现为类似函数宏的形式(§7.1.4),该宏将其参数分配为 NULL,利用该值是不确定的这种特性。(这将需要一些魔法来区分左值,但它将符合规范。)我的断言将不会触发。 - Potatoswatter
2
@unxnut 我猜你的意思是 "!str 的值为 true 表示没有内存分配给 str"。我们指出了一个注意事项(你的答案可能需要提到),如果 str 是一个悬空指针(因此不指向已分配的内存),那么 !str 会导致未定义行为;因此程序可能表现为 !str 的值为 true。 - M.M
显示剩余4条评论

2

在提问之前,您可以进行小型测试。

#include <stdio.h>

int main()
{
    char *str = "test";
    printf("%d\n",*str);
    printf("%c\n",*str); // str[0]
    printf("%d\n",str);
    if (!str || !*str)
    {
        printf("%s",str);
    }

    return 0;
}

!的意思是否定。 if 条件语句中除了 0 以外的所有值都为真。在这里,str*str 返回的值不是 0。因此,你可以得出一个推论。


0

第一个表达式!str的计算结果为真,如果str设置为NULL,如果设置为其他任何值,则为假无论指向的内存是否仍被分配。 如果str保留为不再活动的内存,则这可能导致未定义的行为。

第二个表达式!*str!str由于布尔或运算符的短路作用而计算为真时,只有在str中地址处的值为\0(空字符)时才为真,但根本不会被计算。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接