【问题标题】:Allocating memory and freeing correctly?正确分配内存和释放?
【发布时间】:2021-04-21 09:47:10
【问题描述】:

这是为 2 个未知大小的数组分配内存的代码。 N 由用户给出:

  K=malloc(N*sizeof(int));
if(K==NULL){
 // printf("Sorry, cannot allocate memory\n");
    return -1;
} 

for(i = 0;i < N;i++){
  C = malloc(N * sizeof(int *));
  if (C == NULL){
   return -1;
}

for (i = 0 ; i < N ; i++) {
  *(C+i) = malloc(K[i] * sizeof(int));
  if (*(C+i) == NULL){
   return -1; }
}
} 

两个数组都填充了用户给出的数字。 并释放他们:

    for (i=0 ; i < N ; i++){

   for (i=0 ; i < N ; i++){
    free(*(C+i));
                          }
     free(C);
                           }
void free(void*K);  

通过 gbd 调试我遇到了这个错误

程序收到信号SIGSEGV,分段错误。 _int_free (av=0x10102464c457f, p=0x8005770, have_lock=) at malloc.c:4304 4304 malloc.c: 没有这样的文件或目录。

通过使用 valgrind 更深入地研究这个错误,我似乎没有泄漏。可能是什么问题?

【问题讨论】:

  • 请记住,对于任何指针或数组p 和索引i,表达式*(p + i)完全等于p[i]。这意味着当您使用*(C+i) 时,它与C[i] 相同。后者更易读,写更短。
  • 与您的问题更相关,当您在循环中执行 C = malloc(N * sizeof(int *)); 时,您将有大量内存泄漏。只有来自 last 迭代的分配可从指针 C 获得。另请注意,您永远不会在任何地方初始化 K[i],它将有一个 indeterminate(并且看似随机/垃圾)值。
  • void free(void*K); 什么都不做。它只是free 的原型声明,您可能已经通过包含&lt;stdlib.h&gt; 得到了它。只需拨打free(K);
  • @Someprogrammerdude 数组 K 和 C 的内容充满了用户提供的信息。我对其进行了编辑,使其更有意义

标签: c segmentation-fault malloc free


【解决方案1】:
for(i = 0;i < N;i++){int *));
  if (C == NULL){
   return -1;
}

每次迭代都会丢失先前分配的内存,因为指针被分配了对新分配的内存块的引用。

如果您的意图是更改分配内存的大小,您应该改用realloc

假设 C 是 int **(根据您的程序逻辑)

C = NULL;    
for(i = 0;i < N;i++){
    void *tmp = realloc(C, N * sizeof(*C));
    if (tmp == NULL){
        free(C);
        return -1;
    }
    C = tmp;
}

【讨论】:

    猜你喜欢
    • 2015-12-17
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2016-03-15
    • 1970-01-01
    • 2020-08-25
    相关资源
    最近更新 更多