C - 循环后释放字符串

标签 c memory valgrind

我有这个简单的函数来推断字符串中的子字符串。

char* substr(const char *string, size_t start, size_t end) {

  const char *char_start = &string[start];
  const char *char_end = &string[end];

  char *substring = (char *) calloc(1, char_end - char_start + 1);
  memcpy(substring, char_start, char_end - char_start + 1);

  return substring;
} 

我只有一个 calloc,它创建返回的字符串。 我在一个循环中尝试代码,以推断字符串数组的子字符串。 这是我测试功能的主要代码:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  size_t i;
  char *tmp = NULL;
  char *kmer_array[5] = {"GTGAA", "ACGGT", "AACGG", "AGTGA", "TGAAC"};

  for ( i = 0; i < 5; i++ ) {
    tmp = substr(kmer_array[i], 1, strlen(kmer_array[i]));
  }  

  free(tmp);      

  return 0;
} 

但是当我用 valgrind 测试代码时,这是输出 ( link )。

我不明白我在哪里丢失了字节

最佳答案

你在循环内设置了 5 次 tmp 但只释放了最后一次(在循环外)

关于C - 循环后释放字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55883690/

相关文章:

c - 使用 union 存储的值显示不正确

c - 指向 int 数组的指针和指向 int 的指针之间的语法差异

memory - 密码学:内存中 key 的最佳实践?

c++ - 对象内的 Valgrind 数组溢出

c++ - 意外的内存泄漏 [Valgrind]

在函数中通过指针调用字符串(语法)

c - 从第一个字符串中的第二个字符串中删除所有出现的所有字符

c - 内存中的位存储顺序

java - Android 内存/性能分析工具

compilation - 使用 uCLibc 编译 valgrind