这是我的项目的示例版本。它引发运行时错误,因为我无法清除 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/