c++ - 使用指针的 strcat 实现

标签 c++ c initialization malloc

有谁知道我这样写的时候程序崩溃了

#include<stdio.h>
#include<stdlib.h>

void mystrcat(char *s,char *t) {
    while(*s++);
    s--;
    while(*s++ = *t++);
}

int main(void) {
    int size = 1024;
    char *s1, *s2;

    s1 = (char *)malloc(size);
    //s1[0] = '\0';   ********NOTE THIS********
    s2 = (char *)malloc(size);
    //s2[0] = '\0';   ********NOTE THIS********
    mystrcat( s1, "Hello " );
    mystrcat( s2, "World" );
    mystrcat( s1, s2 );
    printf( "\"%s\"\n", s1 );
    return 0;
}

但奇怪的是,当我不使用那两个“//”注释时,它起作用了!!! 那么为什么添加那些简单的 s2[0] = '\0'; 可以使这个程序运行。

最佳答案

当您通过旧的 C malloc 函数或 C++ new 运算符分配内存时,该内存不会以任何方式初始化。读取初始化的内存会导致未定义的行为,而未定义的行为(或 UB,因为它通常被缩短)是崩溃的主要原因之一。

关于c++ - 使用指针的 strcat 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34988090/

相关文章:

c++ - 函数地址和函数地址的地址之间没有区别吗?

c# - 如何从抽象基 Controller 访问 HttpContext?

MySQL C API内存泄漏?

c - 在 C 中使用 LVM_GETITEM 和 SendMessage 获取 LVITEM 的文本

arrays - 在 Julia 中,如何初始化一个二维数组(矩阵),其中每个元素都是一个列向量?

swift - Swift 中全局初始化与 viewDidLoad 初始化之间有区别吗

c++ - 处理 C++ "initialized but not referenced"警告以销毁作用域助手?

c++ - 如何使 Clang 静态分析器从命令行输出其工作?

c++ - 在 clang++ 中按值怪异传递抽象对象

c++ - C++11 中的递归 lambda 函数