字元陣列賦值,以及memset用法注意
1,字元陣列賦值
char a[10];
怎麼給這個陣列賦值呢?
1、定義的時候直接用字串賦值
char a[10]="hello";
注意:不能先定義再給它賦值,如char a[10]; a[10]="hello";這樣是錯誤的!
2、對陣列中字元逐個賦值
char a[10]={'h','e','l','l','o'};
3、利用strcpy
char a[10]; strcpy(a, "hello");
易錯情況:
1、char a[10]; a[10]="hello";//一個字元怎麼能容納一個字串?況且a[10]也是不存在的!
2、char a[10]; a="hello";//這種情況容易出現,a雖然是指標,但是它已經指向在堆疊中分配的10個字元空間,現在這個情況a又指向資料區中的hello常量,這裡的指標a出現混亂,不允許!
2,memset
1,memset是對位元組進行操作
int array[5] = {1,4,3,5,2};
for(int i = 0; i < 5; i++)
cout<<array[i]<<" ";
cout<<endl;
memset(array,1,5*sizeof(int));// 注意
for(int k = 0; k < 5; k++)
cout<<array[k]<<" ";
cout<<endl;
輸出的結果就是:
1 4 3 5 2
16843009 16843009 16843009 16843009 16843009
為什麼呢?
因為memset是以位元組為單位就是對array指向的記憶體的5個位元組進行賦值,每個都用ASCII為1的字元去填充,轉為二進位制後,1就是00000001,佔一個位元組。一個INT元素是4位元組,合一起就是00000001000000010000000100000001,就等於16843009,就完成了對一個INT元素的賦值了。
所以用memset對非字元型陣列賦初值是不可取的!
例如有一個結構體Some x,可以這樣清零:
memset( &x, 0, sizeof(Some) );
如果是一個結構體的陣列Some x[10],可以這樣:
memset( x, 0, sizeof(Some)*10 );
2,指標注意
main(){
char *s="Golden Global View";
clrscr();
memset(s,'G',6);//貌似這裡有點問題// 單步執行到這裡會提示記憶體訪問衝突
printf("%s",s);
getchar();
return 0;
}
【以上例子出現記憶體訪問衝突應該是因為s被當做常量放入程式儲存空間,如果修改為
char s[]="Golden Global View";則沒有問題了。】
常用字串操作函式的連結: