C - 内存分配和释放内存

时间:2014-09-25 08:15:24

标签: c

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

这段代码给了我错误。 (像堆错误......)

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

我先分配内存,设置值然后释放内存之间的区别是什么?

4 个答案:

答案 0 :(得分:4)

错误原因是您在为它们分配空间后将字符串文字指定给指针。分配空间的指针会因此分配而丢失,并且无法释放并导致内存泄漏。

此外,您正在传递指向free的指针,这些指针不再由malloc家庭功能返回。这将调用未定义的行为

答案 1 :(得分:3)

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

你应该使用strcpy来填充用malloc分配的缓冲区和数据:

strcpy(seq1, "AAAAATTTTT");

但是,这不起作用,因为当mallocing时,你不适应尾随0.你应该为该字符串分配strlen("AAAAATTTTT")+1个字节。

答案 2 :(得分:2)

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

你做的内存分配(最有可能)正常;然而,一旦你用你的文字覆盖了它,你就会泄露那些记忆,然后试图释放文字的记忆(最有可能是UB)。

答案 3 :(得分:1)

您需要为10个字符分配足够的空间并终止' \ 0'
使用strcpy将字符串分配给指针
malloc的返回不需要强制转换

int main(){
    char* seq1 = malloc(sizeof(char)*11); // allows for 10 characters and terminating '\0'
    char* seq2 = malloc(sizeof(char)*11);
    strcpy ( seq1, "AAAAATTTTT"); // assign string to pointer
    strcpy ( seq2, "AAAATTTTGG");
    /* Compare these two sequences */
    free(seq1);
    free(seq2);
}