char str[]="beautiful earth";
memset(str,'*',6);
printf("%s",str);
output:
******ful earth
int arr[15];
memset(arr,1,6);
Нет, вы не можете использовать функцию memset ()`, как это. На странице говорит (акцент шахты):
и 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<6; ++i) // Set the first 6 elements in the array
arr[i] = 1; // to the value 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 не предполагаемое.
На Linux, OSX и других Unix-подобных операционных системах, где wchar_t
имеет 32 бита и вы можете использовать wmemset()
вместо функцию memset()
.
#include<wchar.h>
...
int arr[15];
wmemset( arr, 1, 6 );
Обратите внимание, что wchar_t
имеет на MS-Windows-это 16 бит, так что этот трюк может не работать.
Нет, вы можете'т [компактно] использовать функцию memsetдля этой цели, если требуемое целевое значение
0.
остановлюсь` относится к целевой области памяти как массив байтов, а не массив из целых.
Довольно популярный хак для заполнения области памяти, с повторяющимся рисунком, фактически основана на безопасности
. Он тяжело опирается на ожидания, что функции memcpy` копирование данных в прямом направлении
int arr[15];
arr[0] = 1;
memcpy(&arr[1], &arr[0], sizeof arr - sizeof *arr);
Это, конечно, довольно грязный хак, так как поведение стандарт безопасности
неопределено, когда исходный и конечный пункты области памяти перекрываются. Вы можете написать свой собственный вариант безопасности
, убедившись, что он копирует данные в прямом направлении, и использовать в выше моды. Но это действительно не стоит. Просто использовать простой цикл для задания элементов массива до требуемого значения.
В идеале, вы не можете использовать функцию memset, чтобы установить arrary для всех 1.<БР/>ведь остановлюсь работает на байт, и каждый байт в 1.<БР/>
memset(hash, 1, cnt);
Так когда-то читал, ценность он будет показывать 16843009 = 0x01010101 = 1000000010000000100000001<БР/> Не слово 0x00000001<БР/> Но если ваш requiremnt только для bool или двоичное значение, то можно установить, используя стандарт C99 для библиотеки C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h> //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<cnt; i++)
printf("%d ", hash[i]);
return 0;
}
Выход:<БР/>
Привет, Мир! 1 1 1 1 1
Поскольку никто не упомянул об этом...
Хотя вы не можете инициализировать целых чисел со значением 1
, используя memset, вы можете инициализировать их с значение -1
и просто изменить вашу логику, чтобы вместо того, чтобы работать с отрицательными значениями.
Например, чтобы инициализировать первые 6 цифр вашего массива с -1
, вы могли бы сделать
memset(arr,-1,6*(sizeof int));
Кроме того, если вам нужно сделать после этой инициализации, вы можете объявить массив, чтобы начать со значениями 1
от компиляции.
int arr[15] = {1,1,1,1,1,1};
Остановлюсь наборы значений для типов данных, 1 байт, но есть целых 4 байта или больше , поэтому он выиграл't работа, и вы'll получить значения мусор. Это's в основном используется при работе с char и строковые типы.
Я пробовал следующие программы и кажется, что вы можете инициализировать Ваш массив, используя memset() с только -1 и 0
#include<stdio.h>
#include<string.h>
void printArray(int arr[], int len)
{
int i=0;
for(i=0; i<len; i++)
{
printf("%d ", arr[i]);
}
puts("");
}
int main()
{
int arrLen = 15;
int totalNoOfElementsToBeInitialized = 6;
int arr[arrLen];
printArray(arr, arrLen);
memset(arr, -1, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, 0, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, 1, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, 2, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
memset(arr, -2, totalNoOfElementsToBeInitialized*sizeof(arr[0]));
printArray(arr, arrLen);
return 0;
}
memset((char *)&tab, 0, sizeof(tab));