memset的替代方案

时间:2011-04-19 03:07:09

标签: c initialization memset

我想初始化一个struct数组,但是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));

3 个答案:

答案 0 :(得分:4)

没有标准功能 - 您只需要在循环中调用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 :(得分:4)

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

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

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

答案 2 :(得分:0)

在这种情况下,您不能使用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]));