【问题标题】:Alternative to memsetmemset 的替代品
【发布时间】:2011-08-08 08:15:19
【问题描述】:

我想初始化一个结构数组,但是 memset() 的第二个参数需要一个 int。是否还有另一个功能相同但带有 (void *) 的函数具有第二个参数? 我想到了 memcpy() 但它没有在整个数组中设置值。有什么想法吗?

结构:

typedef struct {
    int x;
    int y;
    char *data;
} my_stuff;

代码:

my_stuff my_array[];
my_array = malloc(MAX * sizeof(my_stuff));

my_stuff *tmp;
tmp->x = -1;
tmp->y = 1;
strcpy(tmp->data = "Initial state");

memset(my_array, tmp, sizeof(my_array));

【问题讨论】:

  • 您究竟需要void* 做什么? memset 在具有非零参数的结构上相当罕见......
  • 好吧,我只是在寻找一个不将 int 作为第二个参数的函数。这样我就可以轻松地将我的结构作为参数传递。我知道我可以使用 for 循环来做到这一点,但我想找到一种更直观的方式来初始化数组。
  • 啊,我明白了......不幸的是,在 C 语言中没有什么可以为你做这件事。:(

标签: c initialization memset


【解决方案1】:

对此没有标准函数 - 您只需在循环中调用 memcpy()

my_stuff *my_array = malloc(MAX * sizeof(my_stuff));
my_stuff tmp;
size_t i;

tmp.x = -1;
tmp.y = 1;
tmp.data = "Initial state";

for (i = 0; i < MAX; i++)
    memcpy(&my_array[i], &tmp, sizeof tmp);

请注意,您不能将strcpy() 转换为tmp.data,因为这只是一个没有分配内存的悬空指针。

【讨论】:

  • +1 但是我更喜欢将tmp 声明为常量:const my_stuff tmp = { -1, 1, "Initial state" };
  • @Ben:是的 - 使用 C99 指定的初始值设定项会更好(您也应该使用 static)。
【解决方案2】:

memset() 设置每个字节的值。将指针类型转换为整数(第二个参数)没有问题。主要问题是它会大于一个字节。

我不知道有任何版本的memset() 会复制多于字节的值。我会为此创建一个简单的循环。

另请注意,如果您的代码有效,还会出现一些其他问题。一方面,sizeof(my_array) 返回数据结构中的总字节数,而不是元素数。此外,您的代码只会复制指针。您需要实际复制它指向的数据,因为目标不是指针——它是实际的结构。

【讨论】:

  • wmemset,但单位大小是wchar_t,在Windows 上是愚蠢的16 位,在其他任何地方都是32 位...
  • @R..:是的,我忘了wmemset()。但是,是的,它更多地用于字符而不是整数。即使是 32 位,它也无法在 64 位系统上复制指针。
【解决方案3】:

在这种情况下,您不能使用 memset()。您应该使用 memcpy()。试试这个: 1. malloc 你的数组 2.初始化数组的第一个元素 3.将第一个元素复制到所有元素中

/* step 1 */
my_stuff *my_array = malloc(MAX * sizeof(my_stuff));
int i;

/* step 2 */
my_array[0].x = -1;
my_array[0].y = 1;
my_array[0].data = "Initial state";

/* step 3 */
for (i = 1; i < MAX; i++)
    memcpy(&my_array[i], &my_array[0], sizeof(my_array[0]));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2012-01-25
    • 2015-08-05
    • 2011-01-01
    • 2011-10-24
    相关资源
    最近更新 更多