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