char*操作期间内存泄漏

char*操作期间内存泄漏,c,string,char,C,String,Char,我在循环中做了类似的事情: char* test = "\0"; test = strcat(test, somestr); ... char* tmp = strstr(test, 0, len); free(test); test = tmp; 并导致内存泄漏。我做错了什么?有几个问题: strcat将向目标缓冲区追加一个字符串。第一个参数必须是缓冲区,而不是字符串文本指针。下面是一个字符缓冲区或字符数组的示例:chartest[1024] strcat的返回值是指向目标缓冲区的指针,

我在循环中做了类似的事情:

char* test = "\0";

test = strcat(test, somestr);
...
char* tmp = strstr(test, 0, len);

free(test);
test = tmp;

并导致内存泄漏。我做错了什么?

有几个问题:

  • strcat
    将向目标缓冲区追加一个字符串。第一个参数必须是缓冲区,而不是字符串文本指针。下面是一个字符缓冲区或字符数组的示例:
    chartest[1024]

  • strcat的返回值是指向目标缓冲区的指针,而不是堆上新分配的字符串。因此,您不应该对返回值调用
    free


  • 有几个问题:

  • strcat
    将向目标缓冲区追加一个字符串。第一个参数必须是缓冲区,而不是字符串文本指针。下面是一个字符缓冲区或字符数组的示例:
    chartest[1024]

  • strcat的返回值是指向目标缓冲区的指针,而不是堆上新分配的字符串。因此,您不应该对返回值调用
    free


  • 您不能
    strcat
    test
    ,因为您最初将它指向一个常量
    char*
    。你需要为它分配内存<代码>strcat
    不起作用

    将代码更改为类似以下内容:

    char* test = (char*)malloc(20*sizeof(char));
    test[0] = '\0'; // nothing on this string to begin with
    strcat(test, "something");
    free(test);
    
    此外,这也行不通:

    char* tmp = strcat(test, 0, len);
    
    因为没有带三个参数的
    strcat
    功能


    记住。99.9%的时间会对每个
    malloc
    分配进行
    free
    调用。

    您不能
    strcat
    test
    ,因为您最初将它指向一个常量
    char*
    。你需要为它分配内存<代码>strcat
    不起作用

    将代码更改为类似以下内容:

    char* test = (char*)malloc(20*sizeof(char));
    test[0] = '\0'; // nothing on this string to begin with
    strcat(test, "something");
    free(test);
    
    此外,这也行不通:

    char* tmp = strcat(test, 0, len);
    
    因为没有带三个参数的
    strcat
    功能


    记住。99.9%的时间会对每个
    malloc
    分配进行
    free
    调用。

    您实际上没有内存泄漏(在您发布的代码中),但是您做了一些错误的事情

    char* test = "\0";
    
    这声明了名为test的指针,并将其初始化为指向两个字节{0,0}的文本数组

    test = strcat(test, somestr);
    
    这将尝试在该字符串文本的末尾追加一些内容(因为作为C字符串它是空的,所以它就像字符串副本)。文字值通常存储在不可写的内存中,因此将某些内容复制到此内存可能会导致错误(许多操作系统上存在分段错误或SIGSEGV)。此外,您只有测试指向的两个字节的存储空间,这意味着除非somestr引用strlen小于或等于1的字符串,否则您将尝试在其他内存上进行写操作(无论测试指向的“\0”后面发生什么)

    我不知道这里发生了什么,因为strstrstr只接受2个参数(它们都是
    constchar*

    这里您试图释放非堆分配的内存。堆是malloc、realloc和calloc获得分配内存的地方。使用这些函数之一(以及某些系统上的一些其他函数)未返回的内存位置调用free是错误的,因为free不知道如何处理它们


    您可能应该记住,内存通常是一个庞大的字节数组,您使用的指针类似于数组索引。您使用的系统可能能够区分此阵列的某些区域,并确定如何访问它们(可读、可写和/或可执行)。但它仍然只是一个字节数组。当您有一个字符串(例如
    “foo”
    )时,这意味着RAM中的某个地方有四个字节(3个字母+终止符字节),您可以通过了解RAM字节数组中的索引来访问该区域。可能还有其他存储在字符串附近的内容(例如,
    {…,4,2,'f',o',o',0,99,3,2,…}
    ),因此您必须尝试确保您保持在该内存空间内,而不会进入相邻数据。

    您实际上没有内存泄漏(在您发布的代码中),但是你做了几件错事

    char* test = "\0";
    
    这声明了名为test的指针,并将其初始化为指向两个字节{0,0}的文本数组

    test = strcat(test, somestr);
    
    这将尝试在该字符串文本的末尾追加一些内容(因为作为C字符串它是空的,所以它就像字符串副本)。文字值通常存储在不可写的内存中,因此将某些内容复制到此内存可能会导致错误(许多操作系统上存在分段错误或SIGSEGV)。此外,您只有测试指向的两个字节的存储空间,这意味着除非somestr引用strlen小于或等于1的字符串,否则您将尝试在其他内存上进行写操作(无论测试指向的“\0”后面发生什么)

    我不知道这里发生了什么,因为strstrstr只接受2个参数(它们都是
    constchar*

    这里您试图释放非堆分配的内存。堆是malloc、realloc和calloc获得分配内存的地方。使用这些函数之一(以及某些系统上的一些其他函数)未返回的内存位置调用free是错误的,因为free不知道如何处理它们

    您可能应该记住,内存通常是一个庞大的字节数组,您使用的指针类似于数组索引。您使用的系统可能能够区分此阵列的某些区域,并确定如何访问它们(可读、可写和/或可执行)。但它仍然只是一个字节数组。当您有一个字符串(例如
    “foo”
    )时,这意味着RAM中的某个地方有四个字节(3个字母+终止符字节),您可以通过了解其ind来访问该区域