Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[C++]隠された引数

C言語のmainで、こんなコードを見ました。

int _tmain(int argc){
  ...
  return 0;
}

Visual C++ 2008なので_tmainになっています。
0個や2個のパターンは多いですが、1個は初めてです。

調子に乗って3個目をつけてみます。

int _tmain(int argc, _TCHAR* argv[], _TCHAR *env[]){
  for (int i = 0;env[i] != NULL; i++){
    printf(L"%s\n", env[i]);
  }
  return 0;
}

なんと、環境変数が入ってます!

4個目はどうだ…コンパイル通っちゃった!!

int _tmain(int argc, _TCHAR* argv[], _TCHAR *env[], int *value){
  // これは実行できる、ただ意味のありそうな値は入ってない
  printf("%x\n", value);
  // こっちはアウト、アドレスじゃないみたい
  printf("%d\n", *value);
  return 0;
}

でも、実行すると無効なアドレスを指しているということで落ちてしまいます。
たまたまメモリにある、適当な値を拾ってきているだけっぽいですね。

ちなみに、こんなmainでもコンパイルエラーにはなりません。

void * _tmain(){
  return 0;
}

要は、mainと名がついていれば細かいことは気にしない性格みたいですよ。

投稿日時 : 2008年10月1日 22:45

Feedback

# re: [C++]隠された引数 2008/10/01 23:46 アキラ

void main()
{
}

とかも言語規格的にはダメなんですけどね。

# re: [C++]隠された引数 2008/10/02 21:20 出水

なんとなく、voidは普通にまずそう
void *でもcharでもなにかしらを返せばスタックに乗るけど
voidでスタックに乗せないまま終わるのは
メモリにたまたまある値をエラーコードにする可能性がありそうです

まぁ、コンパイラが予見して回避コードを埋めてくれそうなんですけど

# re: [C++]隠された引数 2008/10/04 0:09 CH3COOH(酢酸)

賢いコンパイラだったら良いのですけど……


正常動作しているんだけど意味不明な値を返してくる関数があって、
ICE使ってトレースしていったら戻り値が設定されておらず
レジスタ(R0)の値が返ってきていたというハマり方は一度ありました。

# re: [C++]隠された引数 2008/10/04 7:29 出水

int foo(){
/* return なし! */
}
って関数でもWarningすらでない物ってありますよね

何が返っているのか本気で気になります

# re: [C++]隠された引数 2008/10/05 8:45 通りすがり

関数の戻り値が整数型だと、普通のコンパイラはレジスタにつむので、呼び出し側はその時点のレジスタの値(x86だとeax/eaxだったでしょうか)を参照するかと。
main()は明示的にreturnを書かなくても return 0;となると、accelerared c++ に書かれており、実際vcで試すとそのとおりの動作。voidでもOKといいつつ、return 0が返されるので、mainであればクリーンナップコード(?)がこの0を受け取るのではないでしょうか。

# lvzwFfvXXK 2011/12/16 2:00 http://www.healthinter.org/health/page/maxalt.php

Not bad post, but a lot of extra !!...

# zaKkeIJpSkdbBkuQ 2011/12/29 20:59 http://www.healthinter.org/health/page/lumigan.php

The text is promising, will place the site to my favorites..!

タイトル
名前
Url
コメント