1. 程式人生 > >字元陣列賦值,以及memset用法注意

字元陣列賦值,以及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";則沒有問題了。】

常用字串操作函式的連結: