我想编写一些简单的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);
}
这段代码给了我错误。 (像堆错误......)
我删除了内存分配行和空闲内存部分,然后它给了我结果,没有警告和错误。
我先分配内存,设置值然后释放内存之间的区别是什么?
答案 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);
}