我正在处理结构和指针。考虑到以下代码:,我对free
的工作原理有疑问
struct point{
int id;
double* values;
};
int main(int argc, char **argv) {
struct point *dataset = malloc(10 * sizeof(struct point));
....
free(dataset + 7);
}
free
将只释放dataset + 7
和dataset + 8
之间的sizeof(struct point)
,还是将从dataset + 7
释放所有?
关于realloc
,做这样的事情:
struct point{
int id;
double* values;
};
int main(int argc, char **argv) {
struct point *dataset = malloc(10 * sizeof(struct point));
....
free(dataset + 9);
dataset = realloc(dataset, 9 * sizeof(struct point));
}
这种做法错了吗?如果我从dataset
中删除dataset[9]
中的点,我必须先删除free
,然后再删除realloc
?还是只需要realloc
?
这是错误的。您无法重新分配free
ED内存。如果realloc
失败,您还需要保存返回的指向临时变量的指针,以避免内存泄漏。
int main(int argc, char **argv) {
struct point *dataset = malloc(10 * sizeof(*dataset));
struct point *tmp;
tmp = realloc(dataset, 9 * sizeof(*dataset));
if(tmp)
{
dataset = tmp;
}
else
{
/* handle allocation errors*/
}
/* .... */
//when dataset is not needed anymore
free(dataset);
}
注意:最好在sizeof
中使用对象,而不是类型(如我的示例)。还应始终检查内存分配的结果,因为它可能会失败。