在c中使用整数数组的memset

时间:2013-06-25 03:51:16

标签: 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);

11 个答案:

答案 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,否则您不能[移植]使用0memset将目标内存区域视为字节数组,而不是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));