五十路プログラマmaatinブログ

50歳の誕生日にブログを初めてみました。

全体表示

[ リスト ]

VC++のsizeof演算子のVS2003とVS2005での動作の違い

新システムで VC++ 2003 から VC++ 2005 への移行を行っていて、テストでエラーになったために分かったのだが、VC++ 2003 と VC++ 2005 でsizeof演算子の挙動に違いがある。
VC++ 2003で文字列のアドレスをsizeofすると文字列のサイズを返すのだ。

<VC++ 2003>
char a[10];
 sizeof(&a) → 10

sizeof演算子は対象のサイズを返すので、「&a」はアドレスであり、当然 sizeof1(&a) は 4 になると思っていたが、上記のような結果である。(VC++ 2005 では sizeof1(&a) → 4 になる)
普通、アドレスのサイズなんて取得しないよな。と思っていたが、既存のプログラムでcharの2次元配列のサイズを取得するのに以下のようなコーディングをしているものがあった。

#define A_SIZE 10;
char abc[5][A_SIZE];
int i;
char *bf;

bf = malloc(sizeof(&abc[0]));

memcpy(bf, abc[0], A_SIZE);

VC++2003 では、sizeof(&abc[0]) が 50 を返していたようなので、問題なく動作していたが、VC++2005 になると sizeof(&abc[0]) が 4 を返すので、bf は 4 バイトしか確保されず、memcpyでメモリ破壊を起こしていた。
しかも、上記のようなコードが何カ所もあった。
UNIX出身の僕には到底理解出来ないコードだ。
これはVC++ 2003 のバグなのかと思ってググってみたが、今のところ納得のいく情報が見つかっていない。

閉じる コメント(2)

顔アイコン

はじめまして。
たまたまこの記事を拝見し、興味深かったので少し調べてみました。
Cの規格書を持っているわけではないので、
http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3010
を参照したところ、6.5.3.2 アドレス及び間接演算子の部分に、
「単項&演算子は,そのオペランドのアドレスを返す。オペランドが型“〜型”をもっている場合,結果は,型“〜型へのポインタ”をもつ。」
とありますので、上の&aや&abc[0]はchar(*)[10]の型をもつと考えられます。
どちらもポインタですので、32ビット環境では4バイトとなると思います。

2010/1/25(月) 午前 1:15 [ bre*z*_o*a ]

顔アイコン

コメントありがとうございます。
VC++2005の動作はご指摘の通り納得の行く結果なのですが、VC++2003の動作が納得出来ないことと、納得出来ない動作を元に作られたコードが現存していることが問題です。

2010/1/28(木) 午前 2:14 [ maatin ]

コメント投稿
名前パスワードブログ
投稿

閉じる トラックバック(0)

トラックバックされた記事

トラックバックされている記事がありません。

トラックバック先の記事

  • トラックバック先の記事がありません。

芸能人・有名人の新着記事

Yahoo Image
あきみち
Twittergeekpage: @...
05月28日 07:50

.

maatin
人気度

ヘルプ

Yahoo Image

  今日 全体
訪問者 2 1362
ブログリンク 0 0
コメント 0 7
トラックバック 0 0

ケータイで見る

モバイル版Yahoo!ブログにアクセス!

モバイル版Yahoo!ブログにアクセス!

URLをケータイに送信
(Yahoo! JAPAN IDでのログインが必要です)

1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

標準グループ

登録されていません

開設日: 2010/1/3(日)


プライバシーポリシー -  利用規約 -  ガイドライン -  順守事項 -  ヘルプ・お問い合わせ

Copyright (C) 2012 Yahoo Japan Corporation. All Rights Reserved.