1. 程式人生 > >memset()不能對整形陣列初始化

memset()不能對整形陣列初始化

如下demo是可以的,能把陣列中的元素值都設定成字元1

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char a[5];
memset(a,'1',5);
for(int i = 0;i < 5;i++)
cout<<a[i]<<" ";
system("pause");
return 0;
}


而,如下程式想吧陣列中的元素值設定成1,卻是不可行的
</pre><pre name="code" class="cpp"><pre name="code" class="cpp">#include<iostream>
#include <cstring>
using namespace std;
int main()
{
int a[5];
memset(a,1,5);//這裡改成memset(a,1,5 *sizeof(int))也是不可以的
for(int i = 0;i < 5;i++)
cout<<a[i]<<" ";
system("pause");
return 0;
}





問題是:

1,第一個程式為什麼可以,而第二個不行,
2,不想要用for,或是while迴圈來初始化inta[5];能做到嗎?(有沒有一個像memset()這樣的函式初始化)

答:

1.因為第一個程式的陣列a是字元型的,字元型佔據記憶體大小是1Byte,而memset函式也是以位元組為單位進行賦值的,所以你輸出沒有問題。而第二個程式a是整型的,使用memset還是按位元組賦值,這樣賦值完以後,每個陣列元素的值實際上是0x01010101即十進位制的16843009。你看看你輸出結果是否這樣?

2.如果用memset(a,1,20);
就是對a指向的記憶體的20個位元組進行賦值,每個都用ASCII為1的字元去填充,轉為二進位制後,1就是00000001,佔一個位元組。一個INT元素是4位元組,合一起就是1000000010000000100000001,就等於16843009,就完成了對一個INT元素的賦值了。