C 指针和内存 - 理解

标签 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);
 }

最佳答案

在分配给*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

关于C 指针和内存 - 理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46666094/

相关文章:

c++ - 使用 vector 指向基指针的指针数组

ios - 减少弹出 VC 时释放 100 万个以上对象的时间

python - 将 ctypes 与 cuda 结合使用,在脚本末尾出现段错误(核心转储)错误

c - 在列表中插入节点的副本(有条件)

c - getopt() 解析模式不起作用

c++ - 关于 C++ 中内存释放的困惑

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"

c++ - 以下是新的重载泄漏内存吗?

c - 这些行汇编代码的目的是什么?

c - K&R 书末描述的存储分配器中的 "space itself"在哪里?