えムナウ Blog

えムナウ の なすがまま

目次

Blog 利用状況

ニュース


follow mnow at http://twitter.com


えムナウのプログラミングのページ

INETAJ

書庫

日記カテゴリ

ギャラリ

へ~いまさらながら大胆な変更をしたもんだ

我々がCを勉強して使っていた時代は下の二つの値は同じ値だったんだけど、今は違うんだそうだ。
int count = sizeof("1234567890");
char* ptr = "1234567890";
int count2 = sizeof(ptr);

count が11で、count2 がVisualStudio(32BitWindows)だと4。
移行期にはかなり困難があったと推測できる。
#おかげで恥かいた。

http://blogs.wankuma.com/hijun/archive/2007/02/16/62604.aspx

投稿日時 : 2007年2月17日 1:14

コメントを追加

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 1:19 επιστημη

あー。
sizeof("1234567890") は sizeof(char[11])、
sizeof(ptr) はまんま sizeof(char*) と解釈するっすね。

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 1:20 匿名

char* ptr = "1234567890";
sizeof(ptr);



sizeof("1234567890");

では違います。

前者の場合だと、ポインタのサイズが返ってきます。

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 1:25 えムナウ

え~。
ひょっとしたら昔っからそうだったの???

違うよね。
昔は両方同じ値だったんですよね。

#だんだん自信がなくなってきているけど絶対そうだった気がする。

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 2:07 囚人

結構前からポインタのサイズを返す仕様だったような…。(そんなに昔の事は詳しくないのですが)

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 2:20 えムナウ

結構前というからには、
その前は同じだったということでしょう。
MSC4の頃には既に変わっていたことは分かっています。

ただsizeof("1234567890") は我々の時代では、
やってはいけないことの一つだったので、
いつ変わったかは使ってないのでわかりません。

やってはいけないことの理由は、
sizeof("1234567890")が期待した11を返してくれないからです。

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 2:26 ひろえむ

sizeofは文字長ではなく型のサイズですよね?

Cでは文字長はstrlenでとってくるんじゃなかったっけ?(^^;

だからsizeofの"1234567890"はCではchar*のサイズになりそうな気がするんですが、ちゃうんですか?(^^;

私ももう随分昔の記憶だから自信がないですが(^^;

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 2:28 ひろえむ

ってεπιστημηさんが書いていた(^^;
そっかー、"1234567890"ってchar[11]になるのかー。
もうすっかり忘れちゃってるなー(^^;;;;

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 2:31 えムナウ

>Cではchar*のサイズになりそうな気がするんですが
うん少なくともC++では(ある時期からなのか?)、
文字列ポインタのサイズではなくて、
文字列リテラルとみなして文字列の長さを返すらしい。

sizeof("1234567890")は11を返してくれる。

char* ptr = "1234567890";
sizeof(ptr)はchar*のサイズ4を返す。

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 9:13 ひろえむ

あー、やっぱり変わったんですねー。 たぶん、私もえムナウさんと同じ理解をしていたので変わったんだと思うのですが・・・いまいち自信がないっす(^^;;;

でも、それってどうだろうって仕様でもありますねー(^^;
ますますポインタを難解なものにしているような気が・・(^^;;;

でも、そうしないとstructのsizeofを取る時に面倒になったりするのかしら?
関係ないよなー(^^;

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 9:14 囚人

あ、すみません。完全に読み違えてました。
int count = sizeof("1234567890");
char* ptr = "1234567890";
int count2 = sizeof(ptr);
の count2 が、昔は 11 を返していたという意味かと思いました。
count が、昔は 4 を返していたという意味でしょうか?
ん~、だったらそんな気がしなくもないような…。
sizeof("1234567890") なんて多分やったことない…^^;

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 9:52 επιστημη

うん、昔は文字列リテラルがchar*扱いで、
結果sizeof("...")→sizeof(char*)となってたように思います。

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 12:27 匿名

昔っていつごろ?
c89 より前って規格化される前のこと?(K&R)

# re: へ~いまさらながら大胆な変更をしたもんだ 2007/02/17 12:46 えムナウ

LSI-C(80)/HiTECH-C(80と6800)/DECのCのどれかが使い始めで、
その頃のK&Rが教科書だからいつぐらいになるんかね。

C89で初めて規格化されたから規格化されていない時代ですね。

# re: [C言語] 配列の長さを求める 2008/05/20 17:44 webloging

re: [C言語] 配列の長さを求める

タイトル
名前
URL
コメント