Используя memset для целочисленных массивов в C

char str[]="beautiful earth";
memset(str,'*',6);
printf("%s",str);

output:
******ful earth
  1. Как использовать функцию memset, можно инициализировать только несколько целочисленных значений индекса массива к 1, Как указано ниже??
int arr[15];
memset(arr,1,6);
Комментарии к вопросу (5)
Решение

Нет, вы не можете использовать функцию memset ()`, как это. [На странице][1] говорит (акцент шахты):

и GT; функцию memset() функция заполняет первые N**байты** в область памяти, на которую указываетS` с постоянной байт "с".

Так как int является, как правило, 4 байта, это выиграл'т сократить его.


Если вы (неправильно!!) попробуйте сделать вот это:

int arr[15];
memset(arr, 1, 6*sizeof(int));    //wrong!

затем первых 6 `типа int в массив будет установлен 0x01010101 = 16843009.

Единственный раз, когда он'никогда не приемлемо писать через А "клякса" из данных с типом данных Byte(S), является функцию memset(всего, 0, как sizeof(вещи)); чтобы "ноль-аут" в целом струтура/массив. Это работает, потому что нуль, от 0x00000000, 0.0, все нули.


Решение использовать для петли и установить его себе:


int arr[15];
int i;

for (i=0; i
Комментарии (11)

Короткий ответ, нет.

Длинный ответ, остановлюсь наборы байтов и работает для персонажей, потому что они один байт, но чисел нет.

Комментарии (1)

Третьим аргументом memset-это размер в байтах. Так что вы должны установить общий размер в байтах Арр[15]

memset(arr, 1, sizeof(arr));

Однако, вероятно, вы хотите установить значение 1, чтобы все элементы в обр. Затем вы'вэ лучше установить в петле.

for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
    arr[i] = 1;
}

Потому что функцию memset()` устанавливаем 1 в каждый байт. Так что's не предполагаемое.

Комментарии (6)

На Linux, OSX и других Unix-подобных операционных системах, где wchar_t имеет 32 бита и вы можете использовать wmemset() вместо функцию memset().

#include
...
int arr[15];
wmemset( arr, 1, 6 );

Обратите внимание, что wchar_t имеет на MS-Windows-это 16 бит, так что этот трюк может не работать.

Комментарии (0)

Нет, вы можете'т [компактно] использовать функцию memsetдля этой цели, если требуемое целевое значение0.остановлюсь` относится к целевой области памяти как массив байтов, а не массив из целых.

Довольно популярный хак для заполнения области памяти, с повторяющимся рисунком, фактически основана на безопасности. Он тяжело опирается на ожидания, что функции memcpy` копирование данных в прямом направлении

int arr[15];

arr[0] = 1;
memcpy(&arr[1], &arr[0], sizeof arr - sizeof *arr);

Это, конечно, довольно грязный хак, так как поведение стандарт безопасности неопределено, когда исходный и конечный пункты области памяти перекрываются. Вы можете написать свой собственный вариант безопасности, убедившись, что он копирует данные в прямом направлении, и использовать в выше моды. Но это действительно не стоит. Просто использовать простой цикл для задания элементов массива до требуемого значения.

Комментарии (0)

В идеале, вы не можете использовать функцию memset, чтобы установить arrary для всех 1.<БР/>ведь остановлюсь работает на байт, и каждый байт в 1.<БР/>

memset(hash, 1, cnt);

Так когда-то читал, ценность он будет показывать 16843009 = 0x01010101 = 1000000010000000100000001<БР/> Не слово 0x00000001<БР/> Но если ваш requiremnt только для bool или двоичное значение, то можно установить, используя стандарт C99 для библиотеки C


#include 
#include 
#include 
#include         //Use C99 standard for C language which supports bool variables

int main()
{
    int i, cnt = 5;
    bool *hash = NULL;
    hash = malloc(cnt);

    memset(hash, 1, cnt);
    printf("Hello, World!\n");

    for(i=0; i
Комментарии (0)

Поскольку никто не упомянул об этом...

Хотя вы не можете инициализировать целых чисел со значением 1, используя memset, вы можете инициализировать их с значение -1 и просто изменить вашу логику, чтобы вместо того, чтобы работать с отрицательными значениями.

Например, чтобы инициализировать первые 6 цифр вашего массива с -1, вы могли бы сделать

memset(arr,-1,6*(sizeof int));

Кроме того, если вам нужно сделать после этой инициализации, вы можете объявить массив, чтобы начать со значениями 1 от компиляции.

int arr[15] = {1,1,1,1,1,1};
Комментарии (2)

Остановлюсь наборы значений для типов данных, 1 байт, но есть целых 4 байта или больше , поэтому он выиграл't работа, и вы'll получить значения мусор. Это's в основном используется при работе с char и строковые типы.

Комментарии (0)

Я пробовал следующие программы и кажется, что вы можете инициализировать Ваш массив, используя memset() с только -1 и 0


#include
#include

void printArray(int arr[], int len)
{
        int i=0;
    for(i=0; i
Комментарии (0)