Использование memset для инициализации целочисленного массива - PullRequest
0 голосов
/ 18 января 2019

У меня есть массив malloc'd следующим образом:

int* buf;
buf = (int*)malloc(sizeof(int) * N)

где N - количество элементов в массиве целых чисел. Я пытаюсь установить для всех N элементов в массиве определенное значение, скажем, 4 (поэтому buf = [4, 4, 4, ..., 4]).

Для намерений и целей это в основном эксперимент, и поэтому я пытаюсь использовать только memset, без циклов . Возможно ли это?

С memset я делаю:

memset(buf, 4, sizeof(int)*N);

, который, как я предполагал, помещает 4 в массиве в памяти, но, похоже, это работает не так, как ожидалось. Предположим, что N = 20, тогда вывод:

[1,6,8,4,3,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0]

это не то, что я ожидал, но я заметил, что для 4-го элемента (который соответствует sizeof (int) * N) установлено значение 4. Я подумал, что memset установит все на 4, аналогично строковый регистр?

1 Ответ

0 голосов
/ 18 января 2019

Здесь у вас есть два примера

void memsetint(int *table, const int value, size_t size)
{
    while(size--)
    {
        *table++ = value;
    }
}

#define gmemset(table, value, size) _Generic((&table[0]),   \
    int * : memsetint,                                        \
    double * : memsetdouble) (table, value, size)

void memsetdouble(double *table, const double value, size_t size)
{
    while(size--)
    {
        *table++ = value;
    }
}

int main()
{
    double d[1000];

    gmemset(d, 45.34, 1000);
    printf("%f\n", d[300]);

    return 0;
}

#include <string.h>

void mymemset(void *buff, const void *value, const size_t size, size_t count)
{
    unsigned char *b = buff;
    while(count--)
    {
        memcpy(b, value, size);
        b += size;
    }
}

int main()
{
    int x[1000];
    int value = 5;

    mymemset(x, (int []){10}, sizeof(int), 1000);
    mymemset(x, &value, sizeof(int), 1000);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...