结构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数组的主要内容,如果未能解决你的问题,请参考以下文章