2014-09-25 121 views
-2

我需要编写一些简单的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); 
} 

此代码给我的错误。 (类似堆错误...)

我删除了内存分配线和空闲内存部分,然后它给了我没有警告和错误的结果。

什么是我分配内存第一,设置值,然后释放内存,只是不这样做的区别?

+1

“(类似堆错误......)”不够精确。复制您收到的* exact *错误消息。 – 2014-09-25 08:16:28

+0

[如何在C中正确指定新的字符串值]的可能重复(http://stackoverflow.com/questions/3131319/how-to-correctly-assign-a-new-string-value-in-c) – dandan78 2014-09-25 08:18:12

回答

4

错误的原因是您在为它们分配空间后为指针分配字符串文字。指向已分配空间的指针在此赋值中丢失,并且无法释放并导致内存泄漏。

此外,您正在传递指向free的指针,这些指针不会再由malloc系列函数返回。这将调用未定义的行为

2

"AAAAATTTTT"不是char*;它是const char*。它有自己的空间,你不应该释放它。

您所做的内存分配工作(最有可能)正常;然而,一旦你用文字覆盖它,你已经泄露了这些内存,然后试图释放文字的内存(最可能是UB)。

3

seq1是一个指向C字符串的指针。在为你的字符串malloc'd一些内存后,seq1指向它。当你将一个字符串文字分配到seq1时,指针被覆盖并指向一些静态缓冲区。

你还是使用strcpy“填充”分配使用malloc与数据的缓冲区:

strcpy(seq1, "AAAAATTTTT"); 

但是,这不会起作用,因为mallocing的时候,你没有适应拖尾0。应为该字符串分配strlen("AAAAATTTTT")+1个字节。