以下のCプログラムはgccコンパイラでもBorland C++ Compiler(bcc32)でもすんなりコンパイルが通ってしまう。
search_char.c
#include <stdio.h>
int search(char c, char *v){
int index;
while(v[index]){
if(c == v[index]) break;
index++;
}
return index;
}
int main(void)
{
int index;
char value[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
index = search('R', value);
printf("index = %d", index);
return 0;
}
それぞれ実行してみる。
gccコンパイラの実行イメージ
index = 17
Borland C++ Compilerの実行イメージ
Borland C++ Compilerの方は何も起きない。
どちらかと言うとBorland C++ Compilerの方の挙動が正しい。
変数indexは、初期化していないため、C言語の仕様(変数は宣言しただけではどんな値が入っているか分からない)からすれば挙動がおかしくなるはず。
正しくはこうすべきだ。(青字の部分)
#include <stdio.h>
int search(char c, char *v){
int index = 0;
while(v[index]){
if(c == v[index]) break;
index++;
}
return index;
}
int main(void)
{
int index;
char value[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
index = search('R', value);
printf("index = %d", index);
return 0;
}
0クリアしていない変数があってもコンパイル警告は出ない。gccコンパイラは割と変数値を0クリアしてくれるようなので、注意したい。
コメント