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

Output:
******ful earth

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

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

10 回答 10

75

不,你不能这样使用memset()手册页说(强调我的):

该函数用常量 bytememset()填充指向的内存区域的第一个n 字节sc

由于 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.
于 2013-06-25T03:55:00.313 回答
24

简短的回答,不。

长答案,memset设置字节并适用于字符,因为它们是单字节,但整数不是。

于 2013-06-25T03:54:50.623 回答
5

wchar_t在 Linux、OSX 和其他类似 UNIX的 32 位操作系统上,您可以wmemset()使用memset().

#include<wchar.h>
...
int arr[15];
wmemset( arr, 1, 6 );

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

于 2017-10-27T10:26:15.933 回答
4

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。所以这不是你的预期。

于 2013-06-25T03:55:04.030 回答
3

因为没人提...

虽然你不能1使用 memset 用 value 初始化整数,但你可以用 value 初始化它们,-1然后简单地改变你的逻辑来使用负值。

例如,要使用 初始化数组的前 6 个数字-1,您可以这样做

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

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

int arr[15] = {1,1,1,1,1,1};
于 2013-06-25T04:13:11.437 回答
1

不,您不能 [便携式]memset用于该目的,除非所需的目标值是0. memset将目标内存区域视为字节数组,而不是ints 数组。

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

int arr[15];

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

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

于 2013-06-25T04:37:35.553 回答
1

实际上,memset_pattern4一次设置 4 个字节是可能的。

memset_pattern4(your_array, your_number, sizeof(your_array));
于 2020-11-07T21:53:24.070 回答
0

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

于 2017-04-27T15:34:12.080 回答
0

我尝试了以下程序,看来您可以使用 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;
}
于 2018-06-23T06:58:00.357 回答
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

于 2018-09-23T06:25:02.763 回答