C++間違いやすい問題


次の関数の正しい数は0です.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 void test1() {      unsigned  char array[MAX_CHAR+1],i;      for (i=0;i<=MAX_CHAR;i++){          array[i]=i;      } } char *test2() {      char p[] =  "hello world" ;      return p; } char *p =test2(); void test3(){      char str[10];      str++;      *str= '0' ; }
三つは全部間違っている.
分析:
第1の問題:一般的にcharタイプ範囲は-128~127であり、unsigned charタイプ範囲は0~255であるため、iの取値範囲は0~255である.
MAX_CHARの値範囲が255以上の場合、i++を実行すると、iは256以上の数字を表すことができず、無線サイクルに陥る.
2つ目の質問:
ポイントは関数のpのアイデンティティで、彼はポインタなのか、配列名なのか.
ポインタpであれば、pは文字列定数を格納するアドレスを指し、pを返すと文字列定数アドレス値を返し、呼び出し関数が終了しても文字列定数は消えない(定数).したがって、定数を返すアドレスはエラーしない.
配列pであれば、関数は文字列定数の文字を1つずつp配列にコピーし、pを返すと配列pを返すが、呼び出し関数が終了するとpは破棄され、中の要素は存在しない.
例ではpは配列名なのでエラーが発生し,pが指すアドレスはランダム値である.
char p[]=「hello」;char*p="hello";それでいいです.
3つ目の質問:
ポイントはstr++です.この実際の文はstr=str+1です.strは配列名であり,配列名は定数であるため定数に値を割り当てることはできない.(str+1は実行できるがstr=.)