为什么空指针不被计算为NULL

问题描述 投票:0回答:1

我正在使用此函数来解析 CSV 行以处理空项目:

char *strtok_new(char *string, char const *delimiter, char **context)
{
    // context unused
    static char *source = NULL;
    char *p, *ret = 0;

    if (string != NULL) source = string;
    if (source == NULL) return NULL;

    if ((p = strpbrk(source, delimiter)) != NULL) 
    {
        *p = 0;
        ret = source;
        source = ++p;
    }
    return ret;
}

使用示例:

char buffer[64]; // "foo,,,,blabla"
const char delimiters[] = ",";
char *token;
char *ptr;

token = strtok_new(buffer, delimiters, &ptr);
// ...
token = strtok_new(NULL, delimiters, &ptr);
if (token == NULL)
{
  // do someting
}

比较总是错误的。 我添加了调试

printf

Serial.printf("%s,%u,%u\n", token, strlen(token), token[0]);

在其输出的测试用例上:

,0,0

因此我们有一个零长度的字符串,并且(如预期)第一个字节是 0(又名

NULL
)。 为什么
if
子句失败?更改为:

if (strlen(token) == 0)

导致我预期的行为。 我正在使用带有

gnu++2a
标志的适用于 Arduino/ESP32 的 Xtensa 工具链 v8.4.0。 我发现了this问题,但它似乎不适用于这里。

c++ pointers arduino-esp32
1个回答
0
投票

您的问题源于以下方面的混淆:

  • 一根绳子
  • 字符串的第一个字符

这也是以下之间的混淆:

  • 指向字符的指针
  • 一个角色

您的示例代码无关紧要。您的问题可以如下所示:

char* p1 = NULL;
char* p2 = "";
strlen( p1 ) <-- undefined behavior, usually catastrophic failure
strlen( p2 ) <-- returns 0
int n = (p1 == NULL)? -1 : stlen( p1 ) <-- n receives -1
int n = (p2 == NULL)? -1 : stlen( p2 ) <-- n receives 0
© www.soinside.com 2019 - 2024. All rights reserved.