c指针和记忆 - 理解

时间:2017-10-10 11:53:15

标签: c pointers memory-management

代码正在工作它剪切了第一个单词并最终将其放入文本中。我不明白代码中的一行,假设我的字符串是“hello world”。

当我使用代码“* p ++ ='\ 0';”

在此行之前:p: "world"

               s: "hello world"

此行之后:p: "world"

              s: "hello" 

为什么会改变?并削减世界这个词?

完整代码:

void func(char *s)
{
    char * p = strchr(s, ' ');
    char * t = (char*)malloc(strlen(s) + 1);

    if (!t)
    {
        printf("Memory allocated failed");
        exit(1);
    }
    *p++ = '\0';
    strcat(strcat(strcpy(t, p), " "), s);
    strcpy(s, t);
    free(t);
 }

1 个答案:

答案 0 :(得分:2)

在分配到*p之前,您有以下内容:

   +---+---+---+---+---+---+---+---+---+---+---+---+
s: |'H'|'e'|'l'|'l'|'o'|' '|'W'|'o'|'r'|'l'|'d'| 0 |
   +---+---+---+---+---+---+---+---+---+---+---+---+
                         ^
   +---+                 |          
p: |   | ----------------+
   +---+

执行*p++ = '\0';后,您有

   +---+---+---+---+---+---+---+---+---+---+---+---+
s: |'H'|'e'|'l'|'l'|'o'| 0 |'W'|'o'|'r'|'l'|'d'| 0 |
   +---+---+---+---+---+---+---+---+---+---+---+---+
                             ^
   +---+                     |          
p: |   | --------------------+
   +---+

IOW,您已使用字符串终止符替换s中的空格,这就是您在打印"Hello"时才看到s的原因。