if(!ptr_name)何时为真?

时间:2015-12-07 13:57:02

标签: c pointers

代码如下:

#include<stdio.h>

int is_legal(char* name)
{
   if(!name)
        return -1;
   else
        return 0;
}

int main()
{
        char* test_name='\0';
        printf("is legal return value : %d\n",is_legal(test_name));
return 0;
}

给了我结果:

is legal return value : -1

如果将字符串分配给test_name,它会给我一个返回值零,这确实意味着if(!name)为假。

是否有任何方案,除了将test_name分配给'\0',我将if(!name)视为真。

if(!name)是标准做法,检查字符串是否为空?

4 个答案:

答案 0 :(得分:2)

当指针被强制转换为布尔值时,结果为:

  • 如果指针为NULL,则为false(0)

  • 否则

将boolean not运算符(!)应用于指针会强制转换为布尔值,然后反转结果值。

此外,指向空字符串char* ""指针不是 NULL指针。

在测试中,您设置了char* test_name = '\0';,这意味着char* test_name = 0;,因为NULL = 0(对于大多数但不是所有编译器),您test_name是一个NULL指针。

另一方面,如果你创建char* test_name = "\0";(带双引号),结果将是一个指向空字符串的指针,但仍然,指针test_name本身不是NULL指针。

要检查char *指针是否有效以及指向的字符串是否为空,您可以执行以下操作:

`if(test_name && *test_name)` // valid pointer and non-empty string

或否定:

if((test_name == NULL) || (*test_name == '\0')) // invalid pointer or empty string

答案 1 :(得分:1)

if(!name)往往会检查您的案例(!0) if(1)是否为真。

并且

char* test_name='\0';

应该是

char* test_name=NULL;

  

是否有任何方案,除了将test_name分配给&#39; \ 0&#39;,我得到if(!name)为true。

如果您想进入name条件,

non zero必须为if

  

if(!name)是否是检查字符串是否为空的标准做法?

没有。它只是一种检查字符串是否为空的方法。

答案 2 :(得分:1)

你混合了2件事:NULL指针和字符串nul \0终止。

char * nonExistent = NULL;  // Pointer doesn't point to string
char * emptyString = "";    // Pointer points to empty string (array with one element \0)
is_legal(nonExistent); // Returns -1
is_legal(emptyString); // Returns 0

在您的情况下,\0是整型常量0,在分配给指针时会被解释为NULL指针。所以它有效,但是不正确。

测试字符串是非NULL还是非空的典型方法是:

char * str = ...
if(str && *str) { // First check is for NULL pointer, seconds tests for \0 in first element of string
    printf("String exists and is not empty");

答案 3 :(得分:0)

如果is_legal()是NULL指针,则函数-1将返回nameif (!name)在功能上等同于if (name == 0)

问题是,可以通过将零的整数值转换为指针来形成空指针。字符\0是一个整数值,数值为零,所以

char* test_name='\0'; 

会将test_name初始化为空指针。这解释了你看到的输出。

大多数编译器会警告这样做(假设您将编译器配置为最大化警告级别),因为将类型char(值\0)的值转换为指针是一种可疑行为。< / p>