在for循环中,我希望将动态分配的struct
传递给函数。在每次迭代时,我希望在下一次迭代和函数调用之前清零或清除结构的元素。我已经尝试在循环中移动malloc
并在每个循环结束时释放结构,但这并不清除结构。我也尝试了memset(counts, 0, sizeof(counts))
,但这并没有将元素设置为零。
标题文件:
typedef struct counts{
int base_counts[6];
int n1;
int n2;
size_t L_tot_bases;
int L_bad_site;
}counts;
在档案
int main(int argc, char *argv[])
{
int i, row_count = 5;;
struct counts *bulk_counts;
bulk_counts = malloc(sizeof(counts));
for (i = 0; i < row_count; ++i){
get_counts(bulk_counts);
}
}
void get_counts(counts *bulk_counts{
bulk_counts->base_counts[0] = 3;
...
}
答案 0 :(得分:3)
你的memset()
是正确的方法,并且绝对会将所有位(因此所有值,因为它们是整数)设置为零。例如:
struct counts *bulk_counts = malloc(sizeof(counts));
for (i = 0; i < row_count; ++i) {
memset(bulk_counts, 0, sizeof(counts));
get_counts(bulk_counts);
}
然后再次,不需要动态分配,你可以这样做:
for (i = 0; i < row_count; ++i) {
struct counts bulk_counts = {0}; // all members will be zero
get_counts(&bulk_counts);
}
答案 1 :(得分:2)
使用calloc()将是一种方法,它不仅会分配内存而且还会用零初始化内存,但是内存分配是一项昂贵的操作。 memset方法是正确的选择,它将整个块设置为零。
你做错的事情是你没有将指针传递给memset!它应该这样做:
memset(bulk_counts, 0, sizeof(counts))
答案 2 :(得分:1)
您可以按C:
中的值分配整个结构for (i = 0; i < row_count; ++i){
*bulk_counts = ((counts){})
get_counts(bulk_counts);
}
...所以你需要做的是从另一个具有全零成员的结构中分配*bulk_counts
。上面的语法使用counts
文字(缺少的元素自动为零);你也可以,例如在循环之前创建一个命名的,并使用它。
因为它使用基本赋值,所以它应该不比任何其他方式慢;如果存在任何可测量的差异,那么速度最快(对于内置功能使用次优代码,这将是一个非常愚蠢的编译器。)