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]代码>
free
有几个问题:
strcat
将向目标缓冲区追加一个字符串。第一个参数必须是缓冲区,而不是字符串文本指针。下面是一个字符缓冲区或字符数组的示例:chartest[1024]代码>
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来访问该区域