在c中使用整数数组的memset

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

1)像上面使用的memset一样,我们只能初始化几个整数数组索引值为1,如下所示?

 int arr[15]; memset(arr,1,6); 

不,你不能像这样使用memset() 。 该联机帮助页 (强调我的):

memset()函数用常量字节c填充s指向的存储区的前n 字节。

由于int通常是4或8个字节,因此不会删除它。


如果你( 错误!! )尝试这样做:

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

然后数组中的前6个int实际上将设置为0x01010101 = 16843009。

使用非字节数据类型写入“blob”数据的唯一时间是memset(thing, 0, sizeof(thing)); 将整个结构/arrays“归零”。 这是有效的,因为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设置字节并为字符工作,因为它们是单字节,但整数不是。

memset的第三个参数是字节大小。 所以你应该设置arr[15]总字节大小arr[15]

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

但是,您可能希望将值1设置为arr中的整个元素。 然后你最好设置循环。

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

因为memset()在每个字节中设置为1。 所以这不是你的期望。

在Linux,OSX和其他UNIX操作系统上,其中wchar_t是32位,您可以使用wmemset()而不是memset()

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

请注意,MS-Windows上的wchar_t是16位,因此这个技巧可能无效。

不,除非所需的目标值为0 ,否则不能[移植]使用memsetmemset将目标内存区域视为字节数组,而不是int数组。

用重复模式填充内存区域的相当流行的hack实际上是基于memcpy 。 它严重依赖于memcpy向前复制数据的期望

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

当然,这是一个相当丑陋的黑客,因为当源和目标内存区域重叠时,标准memcpy的行为是未定义的。 您可以编写自己的memcpy版本,确保它向前复制数据,并以上述方式使用。 但这不值得。 只需使用一个简单的循环将数组的元素设置为所需的值。

既然没有人提到它……

虽然您无法使用memset初始化值为1的整数,但您可以使用值-1初始化它们,只需更改逻辑以使用负值。

例如,要用-1初始化数组的前6个数字,就可以了

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

此外,如果您只需要执行一次初始化,您实际上可以将数组声明为从编译时开始的值为1

 int arr[15] = {1,1,1,1,1,1}; 

Memset为具有1个字节的数据类型设置值,但是整数具有4个字节或更多,因此它将不起作用并且您将获得垃圾值。 它主要用于处理char和string类型时。

我尝试了以下程序,看起来您可以使用memset()初始化您的数组,仅使用-1和0

 #include #include void printArray(int arr[], int len) { int i=0; for(i=0; i 

理想情况下,您不能使用memset将您的arrary设置为1。
因为memset在字节上工作并将每个字节设置为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 

输出:

你好,世界!
1 1 1 1 1

 memset((char *)&tab, 0, sizeof(tab));