char str[]="beautiful earth";
memset(str,'*',6);
printf("%s",str);
output:
******ful earth
1)像上面使用memset一样,我们只能将几个整数数组的索引值初始化为1,如下所示吗?
int arr[15];
memset(arr,1,6);
答案 0 :(得分:38)
不,你不能像这样使用memset()
。 manpage说(强调我的):
memset()
函数使用常量字节n
填充s
指向的内存区域的第一个c
字节。
由于int
通常为4或8个字节,因此不会将其删除。
如果您(错误!! )尝试这样做:
int arr[15];
memset(arr, 1, 6*sizeof(int)); //wrong!
然后数组中的前6个int
实际上将被设置为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.
答案 1 :(得分:12)
简短回答,不。
长答案,memset
设置字节并适用于字符,因为它们是单字节,但整数不是。
答案 2 :(得分:3)
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。所以这不是你的期望。
答案 3 :(得分:3)
在Linux,OSX和其他类似UNIX的操作系统中,wchar_t
为32位,您可以使用wmemset()
代替memset()
。
#include<wchar.h>
...
int arr[15];
wmemset( arr, 1, 6 );
请注意,MS-Windows上的wchar_t
为16位,因此这个技巧可能无效。
答案 4 :(得分:1)
不,除非所需目标值为memset
,否则您不能[移植]使用0
。 memset
将目标内存区域视为字节数组,而不是int
的数组。
用于填充具有重复模式的内存区域的相当流行的hack实际上基于memcpy
。它严重依赖于期望memcpy
向前复制数据
int arr[15];
arr[0] = 1;
memcpy(&arr[1], &arr[0], sizeof arr - sizeof *arr);
当然,这是一个相当丑陋的黑客,因为当源和目标内存区域重叠时,标准memcpy
的行为是未定义的。您可以编写自己的memcpy
版本,确保它向前复制数据,并以上述方式使用。但这并不值得。只需使用一个简单的循环将数组元素设置为所需的值。
答案 5 :(得分:0)
因为没有人提到它......
虽然您无法使用memset初始化值为1
的整数,但可以使用值-1
初始化它们,只需将您的逻辑更改为使用负值。< / p>
例如,要使用-1
初始化数组的前6个数字,您可以
memset(arr,-1,6*(sizeof int));
此外,如果您只需要执行一次初始化,您实际上可以从编译时声明数组以值1
开头。
int arr[15] = {1,1,1,1,1,1};
答案 6 :(得分:0)
Memset为具有1个字节但整数具有4个字节或更多字节的数据类型设置值,因此它不会起作用,并且您将获得垃圾值。 当你使用char和string类型时,它主要用于它。
答案 7 :(得分:0)
我尝试了以下程序,看来您可以使用仅具有-1和0的memset()初始化数组
#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;
}
答案 8 :(得分:0)
理想情况下,您不能使用memset将全部设置为1。
因为 memset 在字节上起作用并将每个字节设置为1。
memset(hash, 1, cnt);
因此,一旦读取,它将显示 16843009 = 0x01010101 = 1000000010000000100000001
不是 0x00000001
但是,如果您的要求仅是布尔值或二进制值,那么我们可以使用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
答案 9 :(得分:0)
实际上,可以使用memset_pattern4(一次设置4位)。
memset_pattern4(your_array, your_number , sizeof(youre_array));
答案 10 :(得分:-5)
memset((char *)&tab, 0, sizeof(tab));