c语言指针内存分配问题

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

static char **g_line_info;

static void sip_selected_init(int32_t line_num) {
  const char *temp = locale_info_tr(locale_info(), "Line");
  g_line_info = (char **)malloc(sizeof(char *) * line_num);

  for (int32_t i = 0; i < line_num; i++) {
    char *lin_info = malloc(32);
    snprintf(lin_info, 32, "%s%s%d", temp, " ", i + 1);
    g_line_info[i] = lin_info;
  }
}

static void sip_selected_deinit(int32_t line_num) {
  for (int32_t i = 0; i < line_num; i++) {
    free(g_line_info[i]);
    g_line_info[i] = NULL;
  }
  free(g_line_info);
  g_line_info = NULL;
}

int main() {
  sip_selected_init(1);
  sip_selected_deinit(1);

  // 其他代码...

  return 0;
}

以上代码,为什么不用释放line_info

不是没有释放,只是通过将每次循环创建的line_info字符串地址存放到g_line_info字符串数组内,之后在方法sip_selected_deinit根据字符串数组的下标进行释放line_info字符串

这不是释放了吗

【以下回答由 GPT 生成】

根据你的描述,g_line_info 是一个 char** 类型的指针数组,在 sip_selected_init 函数中通过 malloc 函数分配了内存,并对每个元素进行了内存分配的操作。

然而,在 sip_selected_deinit 函数中,只对 g_line_info 和每个元素进行了释放内存的操作,而没有释放 lin_info。

从你的描述中来看,lin_info 并不是这段代码中动态分配的内存,而是静态或者全局变量。如果 lin_info 是一个静态或者全局变量,它的内存是在程序启动时就分配好了,并且不会在程序执行过程中被释放掉。因此,不需要在 sip_selected_deinit 函数中释放 lin_info。

如果 lin_info 的内存是在其他函数中动态分配的,那么在释放之前,可能需要查看代码中是否还有其他地方使用了 lin_info,以确保在释放之前执行了相应操作。

总结起来,在你提供的信息中没有提到 lin_info 的内存分配逻辑,所以无法确定是否存在内存泄漏的问题。如果你能提供更多关于 lin_info 的细节,我可以给出更准确的答案。否则,根据目前的描述,无法确定是否存在内存泄漏的问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^