指针递增到 NULL 直到字符串结尾如下代码但是如果检查它证明是错误的为什么?

Pointer is increment to NULL till end of string as below code but while if check its prove to be wrong why?

Hi 指针递增到 NULL 到字符串的末尾,如下代码但是如果检查它证明是错误的,为什么?

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char *p="Hello,"; // after comma NULL is implicit here
    char *q;
    q=strchr(p,',');  // copyied all char from , till null
    printf("%s\n",q); // good its print , 
    char *temp=strdup(q); // temp contain all string of q
    printf("%s\n",temp); // , good
    if(temp!=NULL)
    {
        *temp++='[=10=]'; // overwriting , with NULL and increment pointer which now point to NULL
        printf("%s\n",temp); // blank because it is NULL
        if(temp==NULL) // bad why this is not true since pointer temp is pointing to NULL?
        {
            printf("its null\n");  // why i am not getting this
        }
    }

增加指针并使其成为 NULL 的唯一方法是循环足够多,使指针地址回绕并变为零。或者,如果您从自身中减去指针,则结果变为零。

一个有效的指针不会通过简单的指针运算变成空指针。可能会越界,但不会变成NULL.

这里发生的是 temp 是单字符字符串 ","。这与包含两个字符 ',''[=17=]' 的数组相同。当您执行 *temp++ = '[=18=]' 时会发生什么,您将字符串修改为 '[=17=]' 后跟 '[=17=]' 两个字符(您将 ocmma 替换为字符串终止符)。运算后temp指向第二个'[=17=]'。变量 temp 本身不是空指针,但它指向空字符(这是完全不同的东西)。

换句话说,您可能想要的可能是这样的:

*temp++ = '[=10=]';
if (*temp == '[=10=]') { ... }

多看一点可能更容易理解"graphically"。

创建重复字符串时

temp = strdup(q);

你会有这样的东西

----+-----+------+----
... | ',' | '[=27=]' | ...
----+-----+------+----
    ^
    |
    +------+
    | temp |
    +------+

即变量 temp 指向一个内存位置,恰好是包含单个逗号的 "string"。

当您执行 *temp++ = '[=18=]' 时,首先发生的是替换 temp 指向的逗号,然后增加指针,这意味着它看起来像这样:

----+------+------+----
... | '[=28=]' | '[=28=]' | ...
----+------+------+----
           ^
           |
           +------+
           | temp |
           +------+