Альтернатива memset - PullRequest
       27

Альтернатива memset

1 голос
/ 19 апреля 2011

Я хочу инициализировать массив 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 ]

4 голосов
/ 19 апреля 2011

memset() устанавливает значение каждого байта. Нет проблем с типизацией указателя на целое число (второй параметр). Основная проблема в том, что он будет больше байта.

Я не знаю ни одной версии memset(), которая копирует больше, чем байтовые значения. Я бы создал для этого простой цикл.

Также обратите внимание, что с вашим кодом возникли бы дополнительные проблемы, если бы он работал. С одной стороны, sizeof(my_array) возвращает общее количество байтов в структуре данных, а не количество элементов. Кроме того, ваш код просто скопировал бы указатель. Вам действительно нужно скопировать данные, на которые он указывает, поскольку цель - это не указатели - это фактические структуры.

4 голосов
/ 19 апреля 2011

Для этого нет стандартной функции - вам просто нужно вызвать 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, потому чтоэто просто свисающий указатель без выделения памяти.

0 голосов
/ 19 апреля 2011

Вы не можете использовать 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]));
...