如何在C中重置结构条目

时间:2009-12-17 09:22:03

标签: c struct

我有一系列结构。它的声明如下:

tableEntry [MAXSCOPE][MAXSIZE];

创建结构时,C会自动将所有成员初始化为0或null。

假设我已经为tableEntry [1] [0],tableEntry [1] [1]和tableEntry [1] [2]的结构成员提供了一些值。

现在我想重新初始化tableEntry [1] [x]中的所有struct成员,其中x可以是从0到MAXSIZE的任何数字。我该怎么办?

基本上,我想“删除”那些结构。后来我可能想写这些结构,我不希望我的新数据被已经存在的任何旧数据污染,这就是为什么我想摆脱所有旧数据并重新初始化它就像它最初创建时一样。

6 个答案:

答案 0 :(得分:4)

不,当变量有静态存储时,C只会自动将所有成员初始化为0,否则你必须写:

struct TableEntry tableEntry [MAXSCOPE][MAXSIZE] = {0};

如果您的tableEntry是全局变量或在函数内声明static,那么您不需要= {0}部分。

然后您可以使用memset重新初始化一些条目:

memset(tableEntry[1], 0, sizeof(struct TableEntry) * MAXSIZE);

会将tableEntry[1][0] ... tableEntry[1][MAXSIZE - 1]重新初始化为0

答案 1 :(得分:1)

为什么不简单

memset( &tableEntry1[1][x], 0, sizeof(tableEntry1[0][0]) );

顺便提一下,x的最大值是MAXSIZE-1,而不是MAXSIZE。

答案 2 :(得分:1)

您可以使用memset将所有位设置为零。

#include <string.h>

    memset(&tableEntry[1][0], 0, sizeof tableEntry[1][0]);
    memset(&tableEntry[1][1], 0, sizeof tableEntry[1][1]);
    memset(&tableEntry[1][2], 0, sizeof tableEntry[1][2]);

    /* if the elements are contiguous in memory,
     * you can set more than 1 in a single statement */
    memset(&tableEntry[1][0], 0, 3 * sizeof tableEntry[1][0]); /* zeroes ...[1][0], [1][1], and [1][2] */

    /* to set all of a sub array */
    memset(tableEntry[1], 0, sizeof tableEntry[1]);

将所有位设置为0可能不是您想要的。如果是这种情况,您需要逐个“删除”元素。

答案 3 :(得分:1)

如果要重置整行,请忽略具有for循环的这些人。您可以在一次调用memset()时执行一行,因为行在内存中是连续的:

memset(&tableEntry[1][0], 0, sizeof(tableEntry[0]));

sizeof(tableEntry[0])将为MAXSIZE * sizeof(type),因此这将重置所有元素,这些元素作为数组的底层必须在内存中连续。 (任何其他人都在说学术界,因为OP已经发布了之前的问题,我相信tableEntry只是在堆栈上分配的二维数组。)

答案 4 :(得分:1)

除了memset建议外,我还提供了这个:

/* Global variables are initialized to zero by compiler. */
struct foo TableEntry[MAXSCOPE][MAXSIZE];
struct foo zero;

/* Initialize yourself. */
for (int i = 0; i < MAXSIZE; ++i)
    TableEntry[1][i] = zero;

如果您希望进行优化,可以在构建脚本中查看memset是否与分配zero结构相同,并可选择使用memset。不过,您可能想要分析一些事情以确定它是否重要。

答案 5 :(得分:0)

memset的所有答案都不会做正确的事情。这是因为对于浮点数和指针,所有位零可能不表示零。你可以这样做:

static struct T zeroed; /* static, therefore every member
                           is initialized to an appropriate
                           'zero' value */
size_t i;
for (i=0; i < MAXSIZE; ++i)
    tableEntry[1][i] = zeroed;