sizeof(char)が必ず1 ..
75:デフォルトの名無しさん
07/08/20 11:52:25
>>71
#include <stdio.h>
int main()
{
printf("%d\n",sizeof(char));
return 0;
}
をCでコンパイルしてみたか?
C++でもコンパイルしてみたか?
76:デフォルトの名無しさん
07/08/20 11:55:31
>>72
これはアブラゼミだね
77:デフォルトの名無しさん
07/08/20 11:56:31
>>75
CとC++でsizeof(char)は絶対1なのは仕様で保証してるんだけど・・・
78:デフォルトの名無しさん
07/08/20 13:19:39
1バイトは8ビットとは限らないが、charは1バイトと規格で決まっている。
ってことでしょ?
79:デフォルトの名無しさん
07/08/20 13:37:00
>>75
もう帰れ無能。
80:デフォルトの名無しさん
07/08/20 13:40:04
>>43
Cの規格での「文字」の定義は「1バイトに納まるビット表現」。
規格書ちゃんと嫁。
81:デフォルトの名無しさん
07/08/20 13:43:49
>>80
文字っつーかcharな。単に文字とか言うとまた噛み付いてくるで。
82:デフォルトの名無しさん
07/08/20 14:01:07
>>81
>単に文字とか言うと
規格に於ける定義の話をしてるんだが。
83:デフォルトの名無しさん
07/08/20 14:25:58
>>82
それならきっちり「文字型」といった方が誤解ないよねとか
文字とだけ言うとシングルバイト文字とマルチバイト文字を
ごっちゃにするやつが出てくるから 規格話するなら正確に
みたいあn
84:デフォルトの名無しさん
07/08/20 14:40:08
>>75
関係ない話なんだが、
sizeof演算子の結果の型はsize_tだけど、こういう場合はintにキャストしなくていいの?
85:デフォルトの名無しさん
07/08/20 15:08:04
>>70
C++だろうとmallocは使えるでしょう?
mallocしたものをdeleteしたりしなければ。
86:デフォルトの名無しさん
07/08/20 15:12:41
>>80
charが1バイトなのは当然として、
1を掛けるのを省略して書いて良いのかどうか
という問題だろう。
87:デフォルトの名無しさん
07/08/20 15:21:31
>>85
使えるけど、new があるのに
>mallocしたものをdelete
する危険を冒してまで態々使う意味が判らない。
>>86
「省略しちゃいけない」とする理由が
「文字数とバイト数は意味が違うから」であれば、
規格上は「文字」=「1バイト文字」であり
「文字数=バイト数」であるから
「省略しても問題ない」よね?という確認。
88:デフォルトの名無しさん
07/08/20 15:35:24
問題は無いね
どうすべきかとなると宗教論争になりそうだ
89:デフォルトの名無しさん
07/08/20 15:37:25
>>86
C FAQにあるよ
90:デフォルトの名無しさん
07/08/20 15:42:03
つきつめるとCHAR_BITすら意味をなさないからあまり気にするものでもないと思うが
91:デフォルトの名無しさん
07/08/20 15:45:13
>>87
> 「文字数=バイト数」であるから
それは数値の一致であって、意味の一致ではない。
あくまでも「1バイト文字」の「文字数」なのだから。
省略してもプログラムは意図した通りに動くが、
プログラムが動けば何だっていいというのは間違い。
92:デフォルトの名無しさん
07/08/20 15:54:11
>>91
はあ…
>それは数値の一致であって、意味の一致ではない。
意味の一致だってばさ。頭悪いなあ。
「規格では、strlen() はバイト数を戻す」
これで納得した?
93:デフォルトの名無しさん
07/08/20 16:06:54
charやstrlenをハードコーディングしちゃうなら*sizeof(char)を書く意味はほとんど無いと思うなぁ。
>>87
new使ったってその危険はdeleteとdelete[]を間違える危険にかわるだけじゃね?
94:デフォルトの名無しさん
07/08/20 16:10:40
なんつーか
みんな暇なの?
95:デフォルトの名無しさん
07/08/20 16:11:19
規格では、strlen() はバイト数と等しい値を返す
だろ?
96:デフォルトの名無しさん
07/08/20 16:25:08
strlenの返す値の意味がバイト数ではなく文字数だと言いたいんですかね。
97:デフォルトの名無しさん
07/08/20 16:43:09
そんなに不安ならコメント書いとこうぜ
98:デフォルトの名無しさん
07/08/20 16:46:35
>>96
格納するのに必要なバイト数
ではないのは確かだな。
99:デフォルトの名無しさん
07/08/20 17:09:30
>>1
アルファベット=レターと非アルファベット記号=キャラクターとストリングの意味からして、strlenが間違い。
100:デフォルトの名無しさん
07/08/20 17:39:16
外人は文字が2バイトかもしれないなんて考えてないから、
strlenという関数名なんだろ。
101:デフォルトの名無しさん
07/08/20 17:50:26
>>94
意味のない議論をしたがる厨房が集まってるだけだろ
102:デフォルトの名無しさん
07/08/20 17:54:08
このスレ、すんごい伸びだな。
103:デフォルトの名無しさん
07/08/20 18:01:54
>>84
整数型の暗黙の変換ルールがあるから問題ない。
ただ、size_tは符号無しだから、
intに変換されることで情報が失われるかも分からんね。
104:デフォルトの名無しさん
07/08/20 18:05:52
>>100同感
2バイトあれば全世界の文字が収まると勘違いしていたしな。
105:デフォルトの名無しさん
07/08/20 18:14:57
してません
106:デフォルトの名無しさん
07/08/20 18:22:55
このさい8バイトでいいだろ。
107:デフォルトの名無しさん
07/08/20 18:23:09
>>100
記号一つに2バイトなんて無意味だし不可能。
strlenが誕生した時代は数バイトのメモリが数万円。
108:デフォルトの名無しさん
07/08/20 18:30:18
んなわけないだろ
109:デフォルトの名無しさん
07/08/20 18:36:58
そんなにsizeof書きたくないんだったら高級言語つかえよ
110:デフォルトの名無しさん
07/08/20 18:40:09
なんじゃそりゃ
111:デフォルトの名無しさん
07/08/20 18:42:46
そんなにsizeof書きたいんだったら高級言語使うなよ
112:デフォルトの名無しさん
07/08/20 18:44:08
>>108
PDP-11は、メモリ64KB程度搭載で、1万ドルくらいだったそうだな。
当時の為替レートからすると、360万円か。
数バイト数万円は違うが、数Kバイト数万円くらいだな。
113:デフォルトの名無しさん
07/08/20 18:44:38
>>111
C言語は高級言語ではないな。
114:デフォルトの名無しさん
07/08/20 18:52:11
>>112
メモリのコストはその一部でしょう
115:デフォルトの名無しさん
07/08/20 18:53:46
>>1
#defineで定義しておけ。
116:デフォルトの名無しさん
07/08/20 18:54:59
>>114
昔のコンピュータは、メモリのコストは一部なんてもんじゃなく、かなりを占めていたのよ。
117:デフォルトの名無しさん
07/08/20 18:56:14
MSXの32KB増設RAMカートリッジが1万円以上だったのを
思い出したような
118:デフォルトの名無しさん
07/08/20 18:58:40
Cができたのってやっとシリコンメモリが普及し始めたころだっけ?
119:デフォルトの名無しさん
07/08/20 19:03:27
>>84
キャストするべき。
size_tがintと同じサイズである保証は全くない。
sizeof(int) == sizeof(long)の環境に限定するなら、省略するのもありかも試練が。
120:デフォルトの名無しさん
07/08/20 19:25:26
C FAQを見てはいけないスレはここですか?
121:デフォルトの名無しさん
07/08/20 19:32:08
>>118
PDP-11の頃
>>120
C FAQは聖典ですか?
122:デフォルトの名無しさん
07/08/20 19:40:30
聖典w
123:デフォルトの名無しさん
07/08/20 20:38:51
>>121
>C FAQは聖典ですか?
いいえ、常識です。
124:デフォルトの名無しさん
07/08/20 20:43:43
>>100
>>107
UTF-16とか思い出してあげてください。
125:デフォルトの名無しさん
07/08/20 23:07:54
>>123
C FAQ では、sizeof(char)を使うのは、プログラムがわかりやすくなるから、一興だと言ってるが?
126:デフォルトの名無しさん
07/08/20 23:10:14
>>124
UTF-16は1文字=2バイトじゃねーよ
127:デフォルトの名無しさん
07/08/20 23:13:15
>>125
ぜんぜんいらねーよ。
とも書いているね。まあどっちも正しいってことだな。
128:デフォルトの名無しさん
07/08/20 23:15:32
書かなかったからといって不正なプログラムというわけではない。
ということだな。
129:デフォルトの名無しさん
07/08/20 23:25:35
>>126
小学生からやり直せ
130:デフォルトの名無しさん
07/08/20 23:37:29
>>129
Cにおいてsizeof(char)=1は仕様だが、
1バイトが8ビットなのは仕様ではない。
131:デフォルトの名無しさん
07/08/21 00:08:16
つまんねー内容をだらだらだらだら
何を言い合ってんのおまえら (w
132:デフォルトの名無しさん
07/08/21 00:19:55
ここの人達が、同じプロジェクトに放り込まれたら、
どうなるんだろう...
C FAQ は理解しやすくなる「かも」とかいてあるけど、
逆に意図が分からなくて困惑する人もいるかも。
133:デフォルトの名無しさん
07/08/21 00:22:53
同じプロジェクトに入ったら個人レベルでソースファイルを分割し
他人が担当しているソースファイルは一切見ないようにすればOK。
レビューとかあれば、同じ信念をもち曲げないメンバーでする。
そんなプロジェクトやだなぁw
134:デフォルトの名無しさん
07/08/21 00:44:11
>>130
>>100と>>107がC言語の規格が決まった当時の話をしてるのに、
>>124はもっと最近の話をしてるところが突っ込みどころなわけであって。
ナニコレ。
>UTF-16は1文字=2バイトじゃねーよ
>Cにおいてsizeof(char)=1は仕様だが、
>1バイトが8ビットなのは仕様ではない。
誰がUTF-16の1文字=2バイトとか言ってんだ?
んー・・・もしやUTF-16は1バイトが8ビットの環境て使うべきでない、
とかそういう意見をお持ちの方?
135:デフォルトの名無しさん
07/08/21 01:57:32
>>134
charは文字だろ
って話の寄り道だったんじゃないか?
136:デフォルトの名無しさん
07/08/21 07:54:41
マロック・ストラレン
137:デフォルトの名無しさん
07/08/21 08:07:00
文字の型を隠蔽してsizeof(TCHAR)でいくね
138:デフォルトの名無しさん
07/08/21 10:44:54
>>137
C++ のクラスをWin32とWinCEで使いまわす俺には必須だぜ!
ところで、>>129 がどこに突っ込んでるのかが知りたい。
UTF-16の1文字は2バイトとは限らないし
2オクテットとも限らないわけだが。
139:デフォルトの名無しさん
07/08/21 11:46:27
1バイトのビット数ってこの話にはあんまり関係ないような
140:デフォルトの名無しさん
07/08/21 11:57:51
>>138
根本的にズレてるって意味だろう。
>124 は別にUTF-16が1文字=2バイトだとは言ってないから。
141:デフォルトの名無しさん
07/08/21 12:21:34
>>138
Win32でもUnicodeでやればいいじゃんかー。
142:デフォルトの名無しさん
07/08/21 12:33:10
スレの趣旨がわからなくなってきた
143:デフォルトの名無しさん
07/08/21 13:37:16
1nibble=4bit
144:デフォルトの名無しさん
07/08/21 14:46:42
1nibble=4bit
1byte=8bit
1word=16bit
1dword=32bit
だっけか
環境とか詳しいことは知らんが
145:デフォルトの名無しさん
07/08/21 14:59:30
1ワードは36bitだよ。
146:デフォルトの名無しさん
07/08/21 15:12:29
1byte=8bitとは限らない。
147:デフォルトの名無しさん
07/08/21 15:25:06
32ビット256Kワードとかよくある話だな
148:デフォルトの名無しさん
07/08/21 20:46:59
>>142
暇つぶし
149:デフォルトの名無しさん
07/08/21 21:40:25
結論。
必ず1だから省略すべし。
150:デフォルトの名無しさん
07/08/21 21:53:41
省略するのは最適化コンパイラの仕事であって人間の仕事ではない。
151:デフォルトの名無しさん
07/08/21 22:00:31
コンパイラは省略しません。そういう意味では無駄にコストが発生します。
# 勿論、コンパイルのね。
152:デフォルトの名無しさん
07/08/21 23:06:13
>>151
いや、定数の演算だから消えてなくなるだろ
153:デフォルトの名無しさん
07/08/21 23:08:54
もう、どっちなんですか!!!?
154:デフォルトの名無しさん
07/08/21 23:20:24
>>152
消えてなくなると言うことは、コンパイラは省略せずにちゃんと最適化したということですね。
155:デフォルトの名無しさん
07/08/21 23:24:28
意味はあっても価値はない。ってところかしら?
価値が無いからと言って、消して良いのか?
でも最適化でけされるよ。
消されなかったら実行時のコストだな。
じゃあ、今、消しておこう。
156:デフォルトの名無しさん
07/08/22 02:04:18
消してしまったsizeof(char)を復元する必要が出てきたときに
莫大なエネルギーが消費されるからそのままにしておいたほうがいいお。
仕事でスパゲッティコードをリファクタリングしたときに、
元のコードをコメントで残しとけとか言われて非常に苦労した覚えがあるお。
157:デフォルトの名無しさん
07/08/22 02:13:07
>元のコードをコメントで残しとけ
リファクタリングもへったくれもありませんな。
158:デフォルトの名無しさん
07/08/22 02:23:23
>>156
>復元する必要が出て来たとき。
上の方で誰か書いてたけど、ラッパー関数にするか、マクロにするかして、
一度に変えられる様にしておけば良い。
復元してもどうせ1だからそのまま使う訳じゃないだろう。
159:デフォルトの名無しさん
07/08/22 09:47:48
>>156
>sizeof(char)を復元する必要
Cの仕様が変更にならない限りその必要は無いからな
どうだろうな
160:デフォルトの名無しさん
07/08/22 12:46:00
subversionでいいじゃん
161:デフォルトの名無しさん
07/08/22 21:07:24
…そう言って通る職場なら良いけどな
162:デフォルトの名無しさん
07/08/22 21:54:59
svn厨は退場してください
163:デフォルトの名無しさん
07/08/22 22:36:22
じゃあCVSで・・・ごめん、悪かった
164:デフォルトの名無しさん
07/08/22 22:51:41
それならよし!
165:デフォルトの名無しさん
07/08/22 23:00:05
それでいいんかい!
166:デフォルトの名無しさん
07/08/23 01:40:32
ふつーbzr
167:デフォルトの名無しさん
07/08/23 20:54:00
もうねmallocなんてあちこちで書いてちゃだめなんだよ。
ラッパーとか言うのも違うな。
構造化だよ。オブジェクトを作る段でだけ利用するんだ。
そもそもC++の偉い人がnewなんてすばらしい関数を
用意してくれているんだから、new使えよ。
168:デフォルトの名無しさん
07/08/23 21:34:07
Dの偉い人が動的配列なんてすばらしい機能を
用意してくれているんだから、動的配列使えよ。
169:デフォルトの名無しさん
07/08/23 21:54:16
vector使うお!!
170:デフォルトの名無しさん
07/08/24 00:15:47
え?newって関数なの?演算子かと思ってたんだが・・・
171:デフォルトの名無しさん
07/08/24 00:20:10
C++のnewは演算子だな。
172:デフォルトの名無しさん
07/08/24 00:32:18
newだって寿命管理はプログラマがやらなきゃいけないわけで、
mallocと同じように、
考えて使うところを狭めないと、
収拾が付かなくなる。
173:デフォルトの名無しさん
07/08/24 00:32:33
ってことはoperator newでオーバーロードできたりするの?
174:デフォルトの名無しさん
07/08/24 01:24:37
>>173
何を今更。だからやろうと思えばOS管理外からメモリを引っ張ってくる事だってできる。
175:デフォルトの名無しさん
07/08/24 01:44:33
smart_ptr<T> ptr = Allocator<T>();
みたいなカスタムアロケータ用意するとか
176:デフォルトの名無しさん
07/08/24 09:39:31
演算子は全て関数だと乱暴な言い方も当然出来る。
177:デフォルトの名無しさん
07/08/24 11:39:47
>>176
挙動が違うんだけど。
178:デフォルトの名無しさん
07/08/24 19:45:47
で、sizeof(char)の省略いいの?わるいの?
179:デフォルトの名無しさん
07/08/24 19:48:27
いい
180:デフォルトの名無しさん
07/08/24 20:52:42
文法的にも、プログラム的にも、省略するのは間違いではない。
だが、
プログラムを人間が読んで理解する上では、省略しないほうがよい。
181:デフォルトの名無しさん
07/08/24 22:22:15
>180みたいな人間に合わせるために、省略しない方がいい。
>180みたいな人間が見ることがないコードなら、遠慮することなく省略していい。
182:デフォルトの名無しさん
07/08/25 00:29:12
>>180
そもそも理解の妨げにならない、という話をしてるんじゃないのか。
183:デフォルトの名無しさん
07/08/25 03:38:00
>>180
逆、コンピューターの作法に人間が合わせてるだけ。
人間様はシンプルな方が理解しやすい。
184:デフォルトの名無しさん
07/08/25 09:16:43
>>182
>>180 は理解が足りない、って話じゃないの?
185:デフォルトの名無しさん
07/08/25 11:05:48
書く目的が、、、
(1).人間が理解しやすい、と言うなら、
「無くても理解できる。」、「無駄なコードに見える」
(2).char -> wchar_t や処理系固有の文字型に変更する可能性のためなら、
strlen はchar専用、またsizeof(char)と直接書くのも適切ではない。より汎用的に書くべき。
また#if などで、文全体を置き換えるとすれば、(1).より、無くても良い。
必要な型の場合のみ書く。
(3).その処理系はsizeof(char)自体が、1ではない。
このスレの前提「必ず1でも」に一致しないので、除外する。
186:デフォルトの名無しさん
07/08/25 13:54:03
>>185
>181
187:デフォルトの名無しさん
07/08/25 14:24:25
#define SZCHAR 1
p = (char*)malloc(SZCHAR*strlen(ps));
if(p == NULL)
{
return ERR;
}
こうすればいいじゃね
188:デフォルトの名無しさん
07/08/25 14:37:13
>>187
aho
189:デフォルトの名無しさん
07/08/25 14:44:33
>>187
βακα..._〆(゚▽゚*)
190:デフォルトの名無しさん
07/08/25 15:23:52
>>187
Ma nuke.
191:デフォルトの名無しさん
07/08/25 15:29:12
>>185
汎用的に書くからには、それで正しく動作するように書き、テストもすべきだ。
見かけ倒しで実際にはダメなんてのは迷惑。
だから、charでしか正しく動作しないのであれば、charで書いておくべきだ。
192:デフォルトの名無しさん
07/08/25 23:38:06
VCならTCHAR使えってこった。
193:デフォルトの名無しさん
07/08/26 01:33:34
_TCHARとTCHARの違い、わかって言ってる?
194:デフォルトの名無しさん
07/08/26 04:15:18
>>188
気やすくAhoと言うな。
AWKを作った偉い人の名前だぞ。
195:デフォルトの名無しさん
07/08/26 05:37:47
/*sizeof(char)*/
196:デフォルトの名無しさん
07/08/26 14:29:20
なんかchar型のサイズが1バイトって前提の話になってるけど
C++だとcharのサイズって1(単位なし)だよな。
で、各型のサイズはcharのサイズの整数倍であることが保証されている。
でも1=1バイトかどうかは環境依存だよな?
#あくまで企画上の話なので実際にcharのサイズが1バイトじゃない環境出せとかいうのはなしね。
197:デフォルトの名無しさん
07/08/26 14:37:23
>>196
1バイトが8ビットであることも決まっていない。
CHAR_BITは8以上となっているから、1バイト=7ビットでは規格合致できないけど。
198:デフォルトの名無しさん
07/08/26 14:58:19
>>196
C、C++は 絶対何があってもsizeof(char)は1バイト
と規格で定めてる。
それ以外の環境はありえないし存在しない。
1バイトが8ビットかどうかはこのスレでは論じていない。
199:デフォルトの名無しさん
07/08/26 15:02:07
>>197
とりあえず、規格上のサイズ指定に使われている単位と
環境上で実際にサイズ指定に使われている単位って違うよなってことを
指摘したかっただけなんだ。
で、指摘の件だけど、それはcharのサイズ=1=2バイト(今の話なら14ビット)
で定義してやればその要件は満たすんじゃね?
CHAR_BITはcharを構成するビット数であって1バイトを構成するビット数の
話じゃないよな?
あと、バイトの出自ってIBMの内部呼称でbit octetからきてると思ったんだが
今はなんかビット数に関して不問にするみたいなのってあるのかな?
200:デフォルトの名無しさん
07/08/26 15:12:09
>>199
そういうこと。外から見てcharが2オクテットだったとしても、
CHAR_BIT == 16にして、sizeof (char) == 1にすれば規格合致できる。
いずれにせよ、198の言うとおりこのスレで話すようなことではないけどな。
201:デフォルトの名無しさん
07/08/26 15:47:31
>>198
プログラミング言語C第2版p44(ISBN4-320-02692-6)にはたしかに書いてあるね。
けどプログラミング言語C++第3版(ISBN-4-7561-1895-X)にはそんなこと書いてないよね。
charのサイズに関してはp110で言及してるけど、サイズが1であること、8ビット以上であること、
ほとんどの場合に8ビットバイトであることはかかれてるけど、1バイトとは書いてないよね。
#これよんで9ビットバイトって書いてもいいのかとは確かに思った。
まぁ、何が言いたいかというとcharのサイズが2バイトのC++環境とかだと
sizeof(char)をかけてもC++の仕様レベルで必要バイトサイズとれないよなって話。
#mallocの引数はバイト数なんだよね。
Cは厳密な話知らなかったから知らない。
#ちゃんとC++限定で話してたよね。
>>200
ということで、charのバイトサイズをべつに定義しておいてmallocに渡すときはそれを
使ってバイトサイズに変換しろっていうまとめをするとすれ違いにならないかな?
202:デフォルトの名無しさん
07/08/26 15:48:12
マルチバイトを扱うなら文字列関係は普通ライブラリ化する
不都合が発生してもそこだけ修正するので1の件は重要じゃない
反対にmalloc散らばりまくりの汚い実装なら
17文字余計にタイプすると人件費にして2円位になるから
わざわざ強要してもとコストがかさむだけでメリットがない
203:デフォルトの名無しさん
07/08/26 15:50:25
>>202
>17文字余計にタイプすると人件費にして2円位になるから
計算方法kwsk
204:デフォルトの名無しさん
07/08/26 15:56:25
>>201
wikipediaでもなんでも見ればいいだろ。
205:デフォルトの名無しさん
07/08/26 16:07:59
>>203
例えば1500円/人時で5秒2円位。17文字タイプだとその位にはなる
206:デフォルトの名無しさん
07/08/26 16:14:51
>>201
ISO/IEC 14882(C++の規格だ) の5.3.3 Sizeof にこう書いてある。
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1;
207:デフォルトの名無しさん
07/08/26 16:20:56
>>206
いや、お前さんは流れ読めてなさ杉だろ。
208:デフォルトの名無しさん
07/08/26 16:21:29
#define sizeof(char) 1
209:デフォルトの名無しさん
07/08/26 16:24:36
>>207
>charのサイズが2バイトのC++環境とかだと
っていう>>201の前提がこれで無くなった っていうだけだよ
210:デフォルトの名無しさん
07/08/26 16:25:29
>>201後半
それはない。
そうだとすると、malloc(2)の返すポインタが
要素数2つのchar配列として使えないという意味になるではないか。
mallocが使う単位もまた、sizeofと同じ。
211:デフォルトの名無しさん
07/08/26 16:36:14
>>209
sizeofの単位がバイトとはどこにも書いてないだろう
212:201
07/08/26 16:36:27
>>209
いやいや。だから、規格だと1とは書いてあるけどそれが1バイトを意味するって書いてないよねってはなし。
たとえば1=1ワードとかあり得るわけで。昔とかだと1ワード9ビットとか10ビットのマシンってあったしね。
その1ってなんだ? っていうお話。
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1;
じゃなくて、
sizeof(char), sizeof(signed char) and sizeof(unsigned char) are 1 byte;
ってかいてあるなら自分の言ってることは間違いってことになるけど。
>>210
そうだよ。だから、規格上ではホントにそれが保証できないって言いたいわけ。
malloc(8)の返すポインタが要素数2つのint配列として使えないのと同じってこと。
mallocが使う単位はbyteでsizeofの単位はC++に限って言うならcharのサイズを1とした環境依存。
実用上同じでないと使い勝手が悪いというのならそれには同意。
213:デフォルトの名無しさん
07/08/26 16:43:08
C99ではsizeofの結果はバイト数ってことになってるな。
> sizeof 演算子の結果は、そのオペランドの大きさ(バイト数)とする。
214:デフォルトの名無しさん
07/08/26 16:44:00
>>212
The sizeof operator yields the number of bytes in the object representation of its operand.
ってわけえ、sizeofはバイト数を返します
215:デフォルトの名無しさん
07/08/26 16:46:07
>>201
次のネタどうぞ
216:デフォルトの名無しさん
07/08/26 16:51:06
sizeof()の返り値はバイト数
malloc()の引数はバイト数
では、
strlen()の返り値は何?
バイト数なら、そのまま+1してmallocの引数に渡すのはOKだが、
文字数なら、sizeof(char)を掛けないと、バイト数にはならないよね。
217:デフォルトの名無しさん
07/08/26 16:56:47
The strlen function returns the number of characters that precede the terminating null character.
218:デフォルトの名無しさん
07/08/26 17:00:44
1を掛けても掛けなくても数値は変わらないよね
219:デフォルトの名無しさん
07/08/26 17:03:15
strlenの引数は char* だから文字数=バイト数と考えてよいのでは?
それとも漢字が混じるとそれも1文字として扱われるだろうか?
だとしたら、sizeof(char)掛けてもバイト数にはならないよね。
220:デフォルトの名無しさん
07/08/26 17:03:27
>>216
戻り値はキャラクタ数
1キャラクタは1バイト
よって戻り値はバイト数
ってことだね
221:デフォルトの名無しさん
07/08/26 17:05:29
それは数値の一致であって、意味の一致ではない。
あくまでも「1バイト文字」の「文字数」なのだから。
省略してもプログラムは意図した通りに動くが、
プログラムが動けば何だっていいというのは間違い。
222:デフォルトの名無しさん
07/08/26 17:15:13
仕様上キャラクタ=バイトです。
たまたま文字を意味するときだけ
わかりやすくキャラクタと表記します。
そのため、byte という型はありません。
だってさ。なるほどね。
223:デフォルトの名無しさん
07/08/26 17:19:42
?
224:デフォルトの名無しさん
07/08/26 18:17:13
>>221
1バイト文字の文字数がバイト数と等しいと見なすことの何がいけない。
225:デフォルトの名無しさん
07/08/26 18:25:17
プログラムのコードに現われない、暗黙の変換を行うから、いけない。
226:デフォルトの名無しさん
07/08/26 18:26:25
>>225
暗黙じゃないだろ・・・
227:デフォルトの名無しさん
07/08/26 18:34:00
>>225
こんな自明な事柄、変換じゃないだろ。
228:デフォルトの名無しさん
07/08/26 18:42:37
自明だからといって省略するのは、悪い癖だなぁ。
229:デフォルトの名無しさん
07/08/26 18:57:07
そもそも変換じゃないだろ。
230:201
07/08/26 19:23:37
>>213
>>214
これは知りませんでした。ご教授ありがとうございます。
たしかにsizeof(char)は常に1で、返すのはバイトサイズだからcharが
2バイトの環境ってあり得ないですね。
勘違いしてました。
>>215
ごめん。
俺の疑問は俺の誤解だったということで解決したから、次のネタはないの。。。
単発と言うことで許して。
231:デフォルトの名無しさん
07/08/27 01:09:02
お前ら、こんな下らない話で、よくここまでスレを伸ばしたなぁ。
いまどきmallocとstrlenを散在させるようなコードを書くほうがオカシイ。
strlenなんて使うか? ふつー。
232:デフォルトの名無しさん
07/08/27 01:14:17
最近はもうC自体あんまり使わない
233:デフォルトの名無しさん
07/08/27 01:23:27
>>231
話がループしてるからいくらでも伸びる気がする。
ところで、
「散在させる」ってのはどこから出てきた?
strlenを使わないなら何を使う?(あくまでCだとして)
sizeof(char)を省略すべきでない?
234:!= 231
07/08/27 01:25:34
ここでstrlen_sだなんて言ってみるテスト
235:デフォルトの名無しさん
07/08/27 01:28:31
>>231
くだらないからこそだろう
まさにこれこそが 「自転車置場の議論」 ってやつだな
236:デフォルトの名無しさん
07/08/27 01:35:19
>>233
マクロ、ライブラリ、クラスの中で使うのではなく、
ベタベタと書くコードの中で使う = 散在させる
ぶっちゃけ、適切に局在化されていれば、
多少マズいコードだろうと直せるので、
このスレで話しているようなことは、
どーでもよくなるんですよ。
237:デフォルトの名無しさん
07/08/27 01:39:54
そうだ、マルチバイト文字が存在するからいけないんだ!
今日から、みんな、英語で生活!
それで全員ハッピーだ!
238:デフォルトの名無しさん
07/08/27 01:57:57
Die job death car?
239:233
07/08/27 02:01:15
>>236
「散在させる」はスレの流れから読み取ったわけじゃないのね。
俺も同じ考えだけど、ちょっと論点がずれてる気がする。
「局在化」とか、「直せる」とかはこのスレには関係ないな。
局在化したその場所で「省略するかしないか」ってことが問われてる。
まあ、そこで、「どーでもよい」ってのが答えなんだろうけど。
240:デフォルトの名無しさん
07/08/27 04:21:09
ここで新たな判断基準を持ち込んでみる。
どちらが適切だと思うか主張する場合に、年収も書くこと。
年収の多い人のやり方が、すなわち、より成功に近い。
241:デフォルトの名無しさん
07/08/27 06:00:54
馬鹿発生
242:デフォルトの名無しさん
07/08/27 09:04:13
アホが来たよ・・・
243:デフォルトの名無しさん
07/08/27 09:28:33
>>231
C言語なら「普通」strlenを使うと思う。
NULL終端までのバイト数を取得する関数なんて作るのは、
まぁライブラリの標準関数が使えないプロジェクトぐらいじゃないの?
244:デフォルトの名無しさん
07/08/27 11:19:52
今時charの内部形式を意識しないといけない言語は使うな。
245:デフォルトの名無しさん
07/08/27 16:17:20
>>243
何かにつけてstrlenする、糞遅くて信頼性の低いプログラム書いてるのか。ご苦労さまです。
246:デフォルトの名無しさん
07/08/27 16:20:17
本当、何かにつけてstrlenの必要に迫られるCは疲れるよ。
247:デフォルトの名無しさん
07/08/27 16:25:11
>>245
C厨だがそこには同意
248:デフォルトの名無しさん
07/08/27 17:18:47
strlen
249:デフォルトの名無しさん
07/08/27 17:23:02
struct {
size_t bufferLen ;
size_t validLen ;
char szBuffer[1] ;
} ;
とかの構造体を使って、バッファの長さや有効長を管理したらいいじゃないか。
szBuffer[1]と言いながら、実際にはヒープから長い領域を貰うのは気持ちわるいかもしれないが。
250:デフォルトの名無しさん
07/08/27 17:36:12
>>245
自分がそうだからといって人もそうだとは限りません。
間抜けですね。
251:デフォルトの名無しさん
07/08/27 18:10:40
>>249
そこまでするくらいならC++使う。そもそも使えるときは使っている。
252:デフォルトの名無しさん
07/08/27 19:11:38
>>250
どんなコードを書いているのか披露してほしい。お手本にするから。
253:デフォルトの名無しさん
07/08/27 20:09:30
>>245
fgetsで文字列を読み込んだり、コマンドライン引数を受け取ったりした際に
得られた文字列長を調べるための、strlenより高速で信頼性のある方法を教えてくれまいか?
254:デフォルトの名無しさん
07/08/27 20:59:09
freadを使う
255:デフォルトの名無しさん
07/08/27 21:05:14
それはstrlenより高速で信頼性のある方法なのか?
256:デフォルトの名無しさん
07/08/27 21:29:46
>>253
まず、得られた文字列の長さを調べる必要が、本当にあるのかな。
次に、何かにつけてfgetsするのかな。
257:デフォルトの名無しさん
07/08/27 21:32:02
必要あるからする
258:デフォルトの名無しさん
07/08/27 21:34:11
本当は必要ないのに、必要だと思い込んでいる可能性を疑ってみた?
259:デフォルトの名無しさん
07/08/27 21:37:49
もちろん
260:デフォルトの名無しさん
07/08/27 21:38:54
で、strlenより高速で信頼性のある方法は?
261:デフォルトの名無しさん
07/08/27 21:44:29
じゃぁ>>253は具体的にコードを例示してね。
262:デフォルトの名無しさん
07/08/27 21:50:37
strlenより高速で信頼性のある方法マダー?
263:デフォルトの名無しさん
07/08/27 21:53:02
strlenよりも高速で信頼性のあるstrlen互換の関数の話ではないぞ。
264:デフォルトの名無しさん
07/08/27 21:55:18
基本的に、
気やすくstrlenやstrcpyを使わない
ってだけで、かなり速くなるし、安全性も高まる。
265:デフォルトの名無しさん
07/08/27 21:59:45
酷い例1
char buf[100] ;
char buf2[100] ;
fgets(buf, sizeof(buf), pFin) ;
if (strlen(buf) < sizeof(buf2)) { /* 無意味な長さチェック */
strcpy(buf2, buf1) ; /* ←無意味なコピー */
}
酷い例2
for (i=0 ; i<strlen(s) ; i++) { /* 無意味な有限回数のループ、無意味な毎度の関数呼び出し */
if (s[i] == 'X') { なんたら }
}
266:デフォルトの名無しさん
07/08/27 22:02:14
strlenよりも高速で信頼性のあるstrlen互換の関数マダー?
267:デフォルトの名無しさん
07/08/27 22:07:14
>>264
strlen,strcpyの安全性が低く感じるのは、呼び出し元の安全性が低いから。
速くなるってのは、一度取った長さを変数に入れておくとかってレベルの話かな?
いずれにしろ、これらに限らず「安易に使わない」って意味では同意できる。
268:デフォルトの名無しさん
07/08/27 22:25:48
>>267
> strlen,strcpyの安全性が低く感じるのは、呼び出し元の安全性が低いから。
人間はミスをするものだから、
機械的かつ強制的にチェックしなければ、
意味がない。
バッファの長さが十分であるという、
目に見えない約束なんてものは、
人間のミスには耐えられない。
> 速くなるってのは、一度取った長さを変数に入れておくとかってレベルの話かな?
そんな小手先の最適化ではなく、
strlenを本当に必要な場所でしか使わない、ということ。
269:デフォルトの名無しさん
07/08/27 22:28:11
安易に使わないってどゆこと?
必要だから使うんじゃないか。代替手段があるというのか?
270:デフォルトの名無しさん
07/08/27 22:29:30
>>269
実際にどんなコード書いてるの? 晒してみなよ。
271:デフォルトの名無しさん
07/08/27 22:30:02
253だが、257とか259とか俺じゃないんだが。
なんか>>261に指名されたんで、釣られてちょろっと書いてみる。
エラー処理が抜けてるのは行数削減のため。
引数に与えた文字列から始まる行を表示するプログラム。
fgetsでは無くて、引数の文字列長を取得する例なんで、
簡単のために最大255文字。
#include <stdio.h>
#include <string.h>
#define BUF_SIZE 256
int main(int argc, char *argv[])
{
int len = strlen(argv[1]);
char buf[BUF_SIZE];
FILE *fp = fopen("test.txt", "r");
while ((fgets(buf, BUF_SIZE, fp)) != NULL) {
if(strncmp(argv[1], buf, len) == 0) printf("%s", buf);
}
}
strlenぐらい普通に使うと思うんだけどねぇ。
272:デフォルトの名無しさん
07/08/27 22:32:33
なんかボーっとしてる間に、えらいスレ進んでてびっくりだ。
253と271とコレ以外は俺じゃないんで一応。
273:デフォルトの名無しさん
07/08/27 22:36:16
>>271
それは
「何かにつけてstrlenする」
には該当しないと思うが。
274:デフォルトの名無しさん
07/08/27 22:37:17
>>272
すまんね >>257と>>259は俺だ
君の振りをしたつもりは無いんだけどね
275:デフォルトの名無しさん
07/08/27 22:50:29
こんなどうでもいいことを真剣に議論してるw
ワラタw
276:デフォルトの名無しさん
07/08/27 22:53:27
それはよかった
277:デフォルトの名無しさん
07/08/27 22:55:12
>>273
>>243に対して>>245だったから、strlenを全否定してるように見えたんで、
「まぁ使うんじゃないの?」ぐらいの感じで書いただけだよ。
ループ内とかで同じ文字列に対して何度もstrlen呼んだりとか
そういうのは無駄だと思うよ。
278:デフォルトの名無しさん
07/08/28 22:18:22
結論は出ましたか。
279:デフォルトの名無しさん
07/08/28 22:23:56
結論:
sizeof(char)は省略してもいい
strlenは必要な場合もある
280:デフォルトの名無しさん
07/08/28 22:28:44
上げんな糞
>>1死ね
281:デフォルトの名無しさん
07/08/28 23:30:57
adobePの新作期待age
282:デフォルトの名無しさん
07/08/28 23:46:39
>>1
sizeof(char)が必ず1なら
malloc(sizeof(char)*(strlen(s)+1))
ではなく
malloc(strlen(s)+1)
の方がいい
malloc(sizeof(char)*(strlen(s)+1))
だとsizeof(char) * が冗長
sizeof(char)が必ずしも1でないならわかるが
283:デフォルトの名無しさん
07/08/29 01:23:30
まあCとC++に限って言えば100% 1だからなぁ
284:デフォルトの名無しさん
07/08/29 01:26:43
いい加減ループしすぎ。
285:デフォルトの名無しさん
07/08/29 01:27:14
まぁスレタイがねループしてくださいって言ってるようなもんだからね
286:デフォルトの名無しさん
07/08/29 01:29:27
ループといえば for(;;) と while() の戦争もあったな
オレは意味なくdo〜while派だけど
287:デフォルトの名無しさん
07/08/29 01:38:39
じゃあ俺はgotoを使うぜ!
288:デフォルトの名無しさん
07/08/29 01:41:03
三木は3つまでしかまとめられなかったので 3岐
後藤は5匹を統括してたから 5統
289:デフォルトの名無しさん
07/08/29 06:16:09
ナツカシス
290:デフォルトの名無しさん
07/08/29 06:40:54
ネオジオは100メガビット
291:デフォルトの名無しさん
07/08/29 07:43:01
>>288
三木は右手だからじゃなかったっけ?
292:デフォルトの名無しさん
07/08/29 11:02:31
それもあるな
なんかこう言葉遊びもあそこまで行くと芸術レベルだよな
293:デフォルトの名無しさん
07/08/29 13:07:42
>>284
今頃ノコノコ出てきて画期的なご意見を述べて行かれる
>>282 みたいな間抜けがいる限り、ループは不滅です。
294:デフォルトの名無しさん
07/08/29 21:26:11
exit(0);
295:デフォルトの名無しさん
07/08/29 21:49:41
いまどきマロックなんか使うかよw
newを使えnewを!
296:デフォルトの名無しさん
07/08/29 22:22:16
VirtualAllocは多用しますが何か?
297:デフォルトの名無しさん
07/08/29 23:13:24
sizeof(char)+1が必ず2でも、省略すべきではない
スレリンク(tech板)
298:デフォルトの名無しさん
07/08/29 23:20:02
再帰
299:デフォルトの名無しさん
07/08/30 19:28:14
おもしろいことに、関心と一般の議論の大きさは、
機能の重要性と反比例していることが多い。
その理由は、大きな機能より小さな機能のほうが明確な意見を持ちやすく、
流行のような、一時的な関心を引きやすいからだ。
〜〜Bjarne Stroustrup『C++の設計と進化』
300:デフォルトの名無しさん
07/08/30 22:41:51
>>299
そして、プログラムとは、小さな機能を集めて大きな機能を実現していく。
だから、小さな機能を議論することは、最終的に大きな機能
そして、重大な機能を議論することにつながるのである。
301:デフォルトの名無しさん
07/08/30 23:39:17
ああいえば上祐
302:デフォルトの名無しさん
07/08/31 00:56:46
URLリンク(msdn2.microsoft.com)(VS.80).aspx
世界一巨大なソフトウェア会社のコーディング例では、
len = _vscprintf( format, args ) // _vscprintf doesn't count
+ 1; // terminating '\0'
buffer = malloc( len * sizeof(char) );
のように、sizeof(char)を省略していない。
303:デフォルトの名無しさん
07/08/31 01:34:46
URLリンク(dist.dc.kumamoto-u.ac.jp)
の問題2
「自分なりの理由」があればどちらでも良い。
という答えな気がする。
304:デフォルトの名無しさん
07/08/31 01:41:50
>>303
純真な若者に示す手本として、
s = (char *)malloc(sizeof(char)*n + 1);
というのは、随分と酷いな。
s = (char *)malloc(n + 1);
ならともかく、
s = (char *)malloc(sizeof(char)*n + 1);
はダメだろう。
意味として間違ってる!
305:デフォルトの名無しさん
07/08/31 01:50:23
>>304
まあね、書くのならこのスレの様に
sizeof(char)*(n+1)
のようにヌル文字分も含めるべきだね。
306:デフォルトの名無しさん
07/08/31 01:53:05
>>303
どうしようもない問題集だな。特に問題4の辺りは終わっている。
307:デフォルトの名無しさん
07/08/31 02:23:04
演習3のプログラムも酷い。
例とはいえ、freeしないのは、どうかと。
それに、stdio.hしか#includeしてないぞ!!!
308:デフォルトの名無しさん
07/08/31 02:37:23
>>303のURLのソースを見ると、スタイルシート"masato.css"を使ってる。
URLリンク(www.kumamoto-u.ac.jp)
のトップページでmasatoを検索すると、
URLリンク(www.syst.cs.kumamoto-u.ac.jp)
がヒットする。似たようなセンスの問題が。
URLリンク(www.syst.cs.kumamoto-u.ac.jp)
の問題4は、>>303の演習3と似てる。
そして問題5は、
> 友情をテーマに,mallocと構造体を使った簡潔なプログラムを作りなさい.
という、涙が出そうな秀逸な問題だ。
ちなみに、URLを削って
URLリンク(www.syst.cs.kumamoto-u.ac.jp)
という研究室のWebのメンバーを見ると、助手らしい。
熊本大学だいじょうぶか?
こんな質の低い教育やってちゃイカんぞ。
309:デフォルトの名無しさん
07/08/31 02:49:46
だって、Apache インストール済みだもん。
URLリンク(dist.dc.kumamoto-u.ac.jp)
310:デフォルトの名無しさん
07/08/31 04:12:25
URLリンク(www.syst.cs.kumamoto-u.ac.jp)
> 問題2
> 以下のプログラムを見て,問に答えなさい.
> #include <stdio.h>
> #include <stdlib.h>
>
> #define SIZE 5
>
> int main()
> {
> int a[SIZE], i;
> int *b = (int *)malloc(sizeof(int)*SIZE);
>
> for (i = 0; i < SIZE; i++)
> a[i] = i * i;
>
> for (i = 0; i < SIZE; i++)
> b[i] = a[i];
>
> for (i = 0; i < SIZE; i++)
> printf("%d ", b[i]);
> printf("\n");
>
> return 0;
> }
311:デフォルトの名無しさん
07/08/31 04:12:51
>
> 1. 「配列aとmallocで確保された領域bの違いは,
> 静的に確保されるメモリ領域と,
> __に確保されるメモリ領域という違いがある.」
> __に入る適切な言葉を以下から選びなさい.
>
> a.愛ゆえ
> b.俺的
> c.仮想的
> d.動的
>
> 2. b[2]の型は何ですか?
312:デフォルトの名無しさん
07/08/31 04:15:56
これは問題の間違いを正しなさい、という課題なのかな。
配列aが「静的」だってよ。
313:デフォルトの名無しさん
07/08/31 04:16:42
さらに、for文の書き方が酷い。
同一行に書くのなら {} を省いても構わないが、
別の行に書くのなら {} は省くべきではないのに。
314:デフォルトの名無しさん
07/08/31 05:30:37
sizeof(char)の話に集中しましょうね。
大学のプログラミング演習の課題を添削するスレ
スレリンク(tech板)
315:デフォルトの名無しさん
07/08/31 09:32:49
>>302
そういうことやってるから細かいバグが残ったりなかなか取れなかったり
するんだろ。しっかりしろといいたい。
316:デフォルトの名無しさん
07/08/31 09:37:52
そうだな。
+1を人間がコーディングしていたら、+1し忘れて、バッファオーバーフローするわな。
317:デフォルトの名無しさん
07/08/31 10:12:40
世界一安定してる会社のコーディングスタイルならともかく、バグだらけの会社のそれを例に出されてもな
318:デフォルトの名無しさん
07/08/31 10:13:47
>>317
コード量が膨大だから、バグ含有率が低くても、バグ件数は膨大になるんだよ。
319:デフォルトの名無しさん
07/08/31 12:19:34
>>318
ああいうコードが積み重なってるからね
バグが多くなるのもうなずけるよ・・・
320:デフォルトの名無しさん
07/08/31 13:30:54
>>302
ほんと、あそこのサンプルコードってゴミばっかりだよな。
>>313
お前の推奨するスタイルなんかどーでもいいわけだが。
321:デフォルトの名無しさん
07/08/31 15:12:04
また1つごみを見付けたんで記念カキコ
URLリンク(msdn2.microsoft.com)(VS.80).aspx
pszSrc= new char(12);
if(pszSrc)
pszSrc= "Hello world!";
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5391日前に更新/137 KB
担当:undef