用于归零或清除动态分配结构的元素的有效方法

时间:2014-10-24 04:52:05

标签: c struct

在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;
  ...
}

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文字(缺少的元素自动为零);你也可以,例如在循环之前创建一个命名的,并使用它。

因为它使用基本赋值,所以它应该不比任何其他方式慢;如果存在任何可测量的差异,那么速度最快(对于内置功能使用次优代码,这将是一个非常愚蠢的编译器。)