结构c内的memset数组

Posted

技术标签:

【中文标题】结构c内的memset数组【英文标题】:memset array inside structure c 【发布时间】:2012-05-03 22:35:44 【问题描述】:

我正在尝试 memset 一个存在于结构中的整数数组:

typedef struct _xyz 
    int zList[9000];
 xyz;

int dll_tmain(void)

    xyz *Xyz       =  (xyz *) calloc(10, sizeof(xyz));
    memset((&Xyz[0])->zList, 1, 9000);

我在 memset() 中尝试了很多变体,但无济于事。而不是成为 初始化为1,这个数字是一个巨大的值;

【问题讨论】:

16843009 会有这么大的价值吗? (告诉我们这会很有帮助。) 【参考方案1】:

请记住,memset 将数组的每个 byte 设置为相同的值。因此,您正在将值为 1 的字节复制到数组的前 9000 个字节。假设 4 字节整数,这意味着您正在分配一个值为 0x01010101 的 int。但是,更重要的是,您并没有分配给整个数组,只是它的前 1/4,再次假设 4 字节整数。

你不能用memset 做你想做的事。请改用 for 循环。

【讨论】:

因此,如果 int 数组不在结构内,我可以使用 memset,否则不能?我可以使用指向数组的指针然后使用 memset(不坚持使用 memset,只是想找出原因)。 你永远不能使用 memset。它为数组中的每个字节分配相同的值。但是你想分配0x00000001 现在我明白了。所以 memset 只有在将一块内存初始化为单个字符时才真正有用。如果我想做的只是将所有值设置为 0,那么代码可能会起作用。 没有。您必须使用:sizeof(int)*9000 而不是 9000,否则不会将每个字节都设置为零,只有前 9000/sizeof(int) 个 int 会设置为零。【参考方案2】:

您要设置的“值”作为 int 传递给 memset,但 memset 一次一个字节地“使用此值的无符号字符转换填充内存块”。

因此,您将前 9000 个字节填充到值 0x01。 int 通常是 2、4 或 8 个字节,而不是 1 个字节。

只需编写自己的循环即可。如果你因为某种原因不想自己写,请检查你的系统是否有 wmemset,然后检查你的 wchar_t 是否与 int 大小相同,那么你可以讨厌使用 wmemset。

【讨论】:

我理解你所说的 wmemset。但我不是一个讨厌的男孩,并且会克制。

以上是关于结构c内的memset数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 memset 初始化包含数组的结构向量

如何在 C 中 memset 结构

在 memset 之后未写入结构数组的值

C语言中,memset函数都可以给啥类型的数组清零?

c中的memset struct数组时出现分段错误

零基础学C语言内存知识总结:memset函数和calloc函数