char str[] = "beautiful earth";
memset(str, '*', 6);
printf("%s", str);
Output:
******ful earth
像上面对 memset 的使用一样,我们可以只将几个整数数组索引值初始化为 1,如下所示?
int arr[15];
memset(arr, 1, 6);
不,你不能这样使用memset()
。手册页说(强调我的):
该函数用常量 byte
memset()
填充指向的内存区域的第一个n
字节。s
c
由于 anint
通常是 4 个字节,因此不会减少它。
如果您(错误地!!)尝试这样做:
int arr[15];
memset(arr, 1, 6*sizeof(int)); //wrong!
那么数组中的前 6int
秒实际上将设置为 0x01010101 = 16843009。
唯一一次真正可以接受的是用非字节数据类型写入“blob”数据,就是memset(thing, 0, sizeof(thing));
将整个结构/数组“清零”。这是有效的,因为 NULL、0x00000000、0.0 都完全为零。
解决方案是使用for
循环并自己设置:
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
设置字节并适用于字符,因为它们是单字节,但整数不是。
wchar_t
在 Linux、OSX 和其他类似 UNIX的 32 位操作系统上,您可以wmemset()
使用memset()
.
#include<wchar.h>
...
int arr[15];
wmemset( arr, 1, 6 );
请注意,wchar_t
在 MS-Windows 上是 16 位,所以这个技巧可能不起作用。
memset 的第三个参数是字节大小。所以你应该设置总字节大小arr[15]
memset(arr, 1, sizeof(arr));
但是可能,您应该将值 1 设置为 arr 中的整个元素。那么你最好设置在循环中。
for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
arr[i] = 1;
}
因为memset()
在每个字节中设置 1。所以这不是你的预期。
因为没人提...
虽然你不能1
使用 memset 用 value 初始化整数,但你可以用 value 初始化它们,-1
然后简单地改变你的逻辑来使用负值。
例如,要使用 初始化数组的前 6 个数字-1
,您可以这样做
memset(arr,-1,6*(sizeof int));
此外,如果您只需要进行一次初始化,您实际上可以将数组声明为1
从编译时的值开始。
int arr[15] = {1,1,1,1,1,1};
不,您不能 [便携式]memset
用于该目的,除非所需的目标值是0
. memset
将目标内存区域视为字节数组,而不是int
s 数组。
一种相当流行的用重复模式填充内存区域的技巧实际上是基于memcpy
. memcpy
它严重依赖于向前复制数据的期望
int arr[15];
arr[0] = 1;
memcpy(&arr[1], &arr[0], sizeof arr - sizeof *arr);
当然,这是一个非常丑陋的 hack,因为memcpy
当源和目标内存区域重叠时,标准的行为是未定义的。您可以编写自己的版本memcpy
,确保它正向复制数据,并以上述方式使用。但这并不值得。只需使用一个简单的循环将数组的元素设置为所需的值。
实际上,memset_pattern4
一次设置 4 个字节是可能的。
memset_pattern4(your_array, your_number, sizeof(your_array));
Memset 为具有 1 字节但整数具有 4 字节或更多字节的数据类型设置值,因此它不起作用并且您将获得垃圾值。它主要用于处理 char 和 string 类型。
我尝试了以下程序,看来您可以使用 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 将您的数组设置为全部 1。
因为memset对字节起作用并将每个字节设置为 1。
memset(hash, 1, cnt);
因此,一旦读取,它将显示的值16843009 = 0x01010101 = 1000000010000000100000001
不是0x00000001
但是如果您的要求仅适用于布尔值或二进制值,那么我们可以使用 C 库的 C99 标准进行设置
#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