从 C 函数中清除结构内部动态内存的内容

标签 c

这是我的项目的示例版本。它引发运行时错误,因为我无法清除 bipartition_fn() 函数中数据数组的内容和已分配的动态内存。 在 kdtree_fn()

内的循环中每次重复出现 bipartition_fn() 后,有人可以帮我清除二分区结构中的数据内容吗?
#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int **data;
}kdtree;

typedef struct{
    int *data;
}bipartition;

void kdtree_fn(int *data, bipartition bp);
bipartition bipartition_fn(int *data);

int main(){
  int i;
  int *data;
  data = malloc(4*sizeof(int));
  for(i=0; i<4;i++)
    data[i] = i;
  bipartition bp;
  kdtree kd;
  kdtree_fn(data,bp);

}

void kdtree_fn(int *data, bipartition bp){
  kdtree k1;
  k1.data = malloc(5*4*sizeof(int));
  int i,j;
  for(j=0; j<5; j++){
    bp = bipartition_fn(data);
    for( i=0; i<4; i++){
      k1.data[j][i] = bp.data[i];
      printf("%d ",k1.data[j][i]);
    }
    printf("\n");
  }
  return k1;
}

bipartition bipartition_fn(int *data){
  bipartition bp1;
  int i;
  bp1.data = malloc(4*sizeof(int));
  for(i=0; i<4; i++){
    bp1.data[i] = data[i] +1;
  }
  return bp1;
}

最佳答案

正如 yano 指出的那样,k1.data 是指针到指针到 int (int**) 类型,因此您需要首先分配 int* 数组,然后分配与每个 int* 关联的每个 int 数组

我已经对您的代码进行了更改,以便它现在可以正常工作而不会出现运行时错误。您查看它以了解如何首先分配 k1.data,然后分配 k1.data 的每个元素。另请注意,我对之前分配的所有内容都调用了 free。

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

typedef struct {
    int** data;
} kdtree;

typedef struct {
    int* data;
} bipartition;

void kdtree_fn(int*, bipartition);
bipartition bipartition_fn(int*);

#define ROW 5
#define COL 4

int main(void) {
    int data[COL] = {0};

    int i;
    for(i = 0; i < COL; i++)
        data[i] = i;

    bipartition bp;
    kdtree kd;
    kdtree_fn(data, bp);

}

void kdtree_fn(int* data, bipartition bp) {
    kdtree k1;
    k1.data = (int**)calloc(ROW, sizeof(int*));

    int i;
    for(i = 0; i < ROW; i++)
        k1.data[i] = (int*)calloc(COL, sizeof(int));

    int j;
    for(j = 0; j < ROW; j++) {
        bp = bipartition_fn(data);

        for(i = 0; i < COL; i++) {
            k1.data[j][i] = bp.data[i];
            printf("%d ",k1.data[j][i]);
        }
        printf("\n");

        free(bp.data);
    }

    for(i = 0; i < ROW; i++)
        free(k1.data[i]);
    free(k1.data);
}

bipartition bipartition_fn(int* data) {
    bipartition bp1;
    bp1.data = (int*)calloc(COL, sizeof(int));

    int i;
    for(i = 0; i < COL; i++)
        bp1.data[i] = data[i] + 1;

    return bp1;
}

我使用 calloc 而不是 malloc,以便将内存清零而不是保存垃圾值。

我将您的硬编码数字(4 和 5)更改为符号常量 ROW 和 COL,以便您只需在单个位置更改数字,而不是在整个代码中更改数字。

我将变量“data”设置为数组而不是动态数组,因为这样做没有意义。

关于从 C 函数中清除结构内部动态内存的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46125743/

相关文章:

c - 如何为 int C 哈希表分配内存?

C位操作

c - Solaris 和 Linux 上未对齐的内存访问差异

c - 在 C 中将非常量参数传递给 const 函数参数

c - C 中指针的错误管理

c - ARM单核简单高效的调度实现

c - 这个 C 模式程序有什么问题

c++ - 如何覆盖 exit(),可能是通过抛出异常

c - 不确定我是否应该调用强制转换或对参数执行某些操作

c typedef(ed) 不透明指针