在c中使用整数数组的memset

use*_*571 29 c memset

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

Output:
******ful earth
Run Code Online (Sandbox Code Playgroud)

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

int arr[15];
memset(arr, 1, 6);
Run Code Online (Sandbox Code Playgroud)

Jon*_*art 44

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

memset()功能填充第一n 字节的存储器区域的指向s与恒定字节c.

由于a int通常是4或8个字节,因此不会削减它.


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

int arr[15];
memset(arr, 1, 6*sizeof(int));    //wrong!
Run Code Online (Sandbox Code Playgroud)

然后int数组中的前6个实际上将设置为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.
Run Code Online (Sandbox Code Playgroud)

  • @briankip 数组 [衰减到指针](http://stackoverflow.com/questions/1461432/what-is-array-decaying) 在这里。在这种情况下,`&amp;` 是可选的;`memset(&amp;arr, ...)` 会做同样的事情。 (2认同)

vid*_*dit 14

简短的回答,没有.

答案很长,memset设置字节并为字符工作,因为它们是单字节,但整数不是.


mat*_*ttn 5

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

memset(arr, 1, sizeof(arr));
Run Code Online (Sandbox Code Playgroud)

然而,您可能应该将值 1 设置为 arr 中的整个元素。那么你最好在循环中设置。

for (i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
    arr[i] = 1;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 当调用 memset(arr, 1, 4) 时,它变成 0x01 0x01 0x01 0x01。但你的期望是“0x00 0x00 0x00 0x01”。(这取决于您的 CPU 架构)。 (2认同)

cei*_*cat 5

在Linux,OSX和其他UNIX类操作系统,其中wchar_t的32位,你可以使用wmemset()的替代memset()

#include<wchar.h>
...
int arr[15];
wmemset( arr, 1, 6 );
Run Code Online (Sandbox Code Playgroud)

请注意,wchar_t在 MS-Windows 上是 16 位,所以这个技巧可能不起作用。