Ç - 内存分配和释放内存
问题描述:
我需要编写一些简单的DNA序列比较C源代码Ç - 内存分配和释放内存
这里是我的代码部分
int main(){
char* seq1 = (char*)malloc(sizeof(char)*10);
char* seq2 = (char*)malloc(sizeof(char)*10);
seq1 = "AAAAATTTTT";
seq2 = "AAAATTTTGG";
/* Compare these two sequences */
free(seq1);
free(seq2);
}
此代码给我的错误。 (类似堆错误...)
我删除了内存分配线和空闲内存部分,然后它给了我没有警告和错误的结果。
什么是我分配内存第一,设置值,然后释放内存,只是不这样做的区别?
答
错误的原因是您在为它们分配空间后为指针分配字符串文字。指向已分配空间的指针在此赋值中丢失,并且无法释放并导致内存泄漏。
此外,您正在传递指向free
的指针,这些指针不会再由malloc
系列函数返回。这将调用未定义的行为。
答
"AAAAATTTTT"
不是char*
;它是const char*
。它有自己的空间,你不应该释放它。
您所做的内存分配工作(最有可能)正常;然而,一旦你用文字覆盖它,你已经泄露了这些内存,然后试图释放文字的内存(最可能是UB)。
答
seq1
是一个指向C字符串的指针。在为你的字符串malloc'd一些内存后,seq1
指向它。当你将一个字符串文字分配到seq1时,指针被覆盖并指向一些静态缓冲区。
你还是使用strcpy
“填充”分配使用malloc与数据的缓冲区:
strcpy(seq1, "AAAAATTTTT");
但是,这不会起作用,因为mallocing的时候,你没有适应拖尾0。应为该字符串分配strlen("AAAAATTTTT")+1
个字节。
“(类似堆错误......)”不够精确。复制您收到的* exact *错误消息。 – 2014-09-25 08:16:28
[如何在C中正确指定新的字符串值]的可能重复(http://*.com/questions/3131319/how-to-correctly-assign-a-new-string-value-in-c) – dandan78 2014-09-25 08:18:12