C语言 使用二维字符数组时的内存泄漏

vaqhlq81  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(177)

我正在尝试释放一个二维字符数组,但是当我用fsanitize=address编译并运行程序时,出现了内存泄漏。看起来代码free(innerArray)并没有释放单个字符数组。有什么想法吗?

struct Item {
    char* line;
    struct Item *next;
};

void mainMethod(Item *firstArgument) {
   // Create 2d array
  int r = 5; // r gets some number 
  char **myargs = malloc((r+1)* sizeof(char *));
  myargs[0] = malloc((strlen(command)+1) * sizeof(char));
  myargs[0] = command;
  int i = 1;
  struct Item* arg = firstArgument->next;
  for ( ; i < r; i++) {
    myargs[i] = malloc(((strlen(arg->line)+1)*sizeof(char)));
    strcpy(myargs[i], arg->line);
    arg = arg->next;
  }
  myargs[i] = NULL;

  // do processing ...

  // Free 2d array
  int i = 0;
  while (i <= r) {
    char* innerArr = arr[i];
    free(innerArr);
    i++;
  }
  free(arr);
}
5vf7fwbs

5vf7fwbs1#

这将分配一个字符串,然后将其替换为地址command

myargs[0] = malloc((strlen(command)+1) * sizeof(char));
  myargs[0] = command;

正在泄漏分配的内存。如果不需要副本,请使用第2行,如果需要副本,请执行以下操作:

strcpy(myargs[0], command);

或将两行替换为:

myargs[0] = strdup(command);

和往常一样,您需要检查分配是否失败。sizeof(char)被定义为1,因此您只需忽略它。

相关问题