[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 2chのread.cgiへ]
Update time : 05/09 12:13 / Filesize : 137 KB / Number-of Response : 558
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

sizeof(char)が必ず1でも、省略すべきではない



1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ]
malloc(sizeof(char)*(strlen(s)+1))
ではなく
malloc(strlen(s)+1)
と書くような糞コードばかり見て育った、
悪しき慣習を引きずった人は引退すべし


206 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:20:56 ]
>>206
いや、お前さんは流れ読めてなさ杉だろ。

208 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:21:29 ]
#define sizeof(char) 1

209 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:24:36 ]
>>207
>charのサイズが2バイトのC++環境とかだと
っていう>>201の前提がこれで無くなった っていうだけだよ

210 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:25:29 ]
>>201後半
それはない。
そうだとすると、malloc(2)の返すポインタが
要素数2つのchar配列として使えないという意味になるではないか。

mallocが使う単位もまた、sizeofと同じ。

211 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:36:14 ]
>>209
sizeofの単位がバイトとはどこにも書いてないだろう

212 名前:201 mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:43:08 ]
C99ではsizeofの結果はバイト数ってことになってるな。

> sizeof 演算子の結果は、そのオペランドの大きさ(バイト数)とする。

214 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:44:00 ]
>>212
The sizeof operator yields the number of bytes in the object representation of its operand.

ってわけえ、sizeofはバイト数を返します



215 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:46:07 ]
>>201
次のネタどうぞ

216 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:51:06 ]
sizeof()の返り値はバイト数
malloc()の引数はバイト数

では、
strlen()の返り値は何?

バイト数なら、そのまま+1してmallocの引数に渡すのはOKだが、
文字数なら、sizeof(char)を掛けないと、バイト数にはならないよね。

217 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 16:56:47 ]
The strlen function returns the number of characters that precede the terminating null character.

218 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:00:44 ]
1を掛けても掛けなくても数値は変わらないよね

219 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:03:15 ]
strlenの引数は char* だから文字数=バイト数と考えてよいのでは?
それとも漢字が混じるとそれも1文字として扱われるだろうか?
だとしたら、sizeof(char)掛けてもバイト数にはならないよね。

220 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:03:27 ]
>>216
戻り値はキャラクタ数
1キャラクタは1バイト
よって戻り値はバイト数

ってことだね

221 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:05:29 ]
それは数値の一致であって、意味の一致ではない。
あくまでも「1バイト文字」の「文字数」なのだから。

省略してもプログラムは意図した通りに動くが、
プログラムが動けば何だっていいというのは間違い。

222 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:15:13 ]
仕様上キャラクタ=バイトです。
たまたま文字を意味するときだけ
わかりやすくキャラクタと表記します。
そのため、byte という型はありません。

だってさ。なるほどね。

223 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 17:19:42 ]


224 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:17:13 ]
>>221
1バイト文字の文字数がバイト数と等しいと見なすことの何がいけない。



225 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:25:17 ]
プログラムのコードに現われない、暗黙の変換を行うから、いけない。


226 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:26:25 ]
>>225
暗黙じゃないだろ・・・

227 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:34:00 ]
>>225
こんな自明な事柄、変換じゃないだろ。

228 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:42:37 ]
自明だからといって省略するのは、悪い癖だなぁ。

229 名前:デフォルトの名無しさん mailto:sage [2007/08/26(日) 18:57:07 ]
そもそも変換じゃないだろ。

230 名前:201 mailto:sage [2007/08/26(日) 19:23:37 ]
>>213
>>214
これは知りませんでした。ご教授ありがとうございます。
たしかにsizeof(char)は常に1で、返すのはバイトサイズだからcharが
2バイトの環境ってあり得ないですね。
勘違いしてました。

>>215
ごめん。
俺の疑問は俺の誤解だったということで解決したから、次のネタはないの。。。
単発と言うことで許して。


231 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:09:02 ]
お前ら、こんな下らない話で、よくここまでスレを伸ばしたなぁ。

いまどきmallocとstrlenを散在させるようなコードを書くほうがオカシイ。
strlenなんて使うか? ふつー。

232 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:14:17 ]
最近はもうC自体あんまり使わない

233 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:23:27 ]
>>231
話がループしてるからいくらでも伸びる気がする。
ところで、
「散在させる」ってのはどこから出てきた?
strlenを使わないなら何を使う?(あくまでCだとして)
sizeof(char)を省略すべきでない?


234 名前:!= 231 mailto:sage [2007/08/27(月) 01:25:34 ]
ここでstrlen_sだなんて言ってみるテスト



235 名前:デフォルトの名無しさん [2007/08/27(月) 01:28:31 ]
>>231
くだらないからこそだろう

まさにこれこそが 「自転車置場の議論」 ってやつだな


236 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:35:19 ]
>>233
マクロ、ライブラリ、クラスの中で使うのではなく、
ベタベタと書くコードの中で使う = 散在させる

ぶっちゃけ、適切に局在化されていれば、
多少マズいコードだろうと直せるので、
このスレで話しているようなことは、
どーでもよくなるんですよ。


237 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:39:54 ]
そうだ、マルチバイト文字が存在するからいけないんだ!
今日から、みんな、英語で生活!
それで全員ハッピーだ!


238 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 01:57:57 ]
Die job death car?

239 名前:233 mailto:sage [2007/08/27(月) 02:01:15 ]
>>236
「散在させる」はスレの流れから読み取ったわけじゃないのね。

俺も同じ考えだけど、ちょっと論点がずれてる気がする。
「局在化」とか、「直せる」とかはこのスレには関係ないな。
局在化したその場所で「省略するかしないか」ってことが問われてる。
まあ、そこで、「どーでもよい」ってのが答えなんだろうけど。

240 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 04:21:09 ]
ここで新たな判断基準を持ち込んでみる。

どちらが適切だと思うか主張する場合に、年収も書くこと。
年収の多い人のやり方が、すなわち、より成功に近い。

241 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 06:00:54 ]
馬鹿発生

242 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 09:04:13 ]
アホが来たよ・・・

243 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 09:28:33 ]
>>231
C言語なら「普通」strlenを使うと思う。

NULL終端までのバイト数を取得する関数なんて作るのは、
まぁライブラリの標準関数が使えないプロジェクトぐらいじゃないの?

244 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 11:19:52 ]
今時charの内部形式を意識しないといけない言語は使うな。



245 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:17:20 ]
>>243
何かにつけてstrlenする、糞遅くて信頼性の低いプログラム書いてるのか。ご苦労さまです。

246 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:20:17 ]
本当、何かにつけてstrlenの必要に迫られるCは疲れるよ。

247 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 16:25:11 ]
>>245
C厨だがそこには同意

248 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:18:47 ]
strlen

249 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:23:02 ]
struct {
size_t bufferLen ;
size_t validLen ;
char szBuffer[1] ;
} ;
とかの構造体を使って、バッファの長さや有効長を管理したらいいじゃないか。
szBuffer[1]と言いながら、実際にはヒープから長い領域を貰うのは気持ちわるいかもしれないが。

250 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 17:36:12 ]
>>245
自分がそうだからといって人もそうだとは限りません。
間抜けですね。

251 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 18:10:40 ]
>>249
そこまでするくらいならC++使う。そもそも使えるときは使っている。

252 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 19:11:38 ]
>>250
どんなコードを書いているのか披露してほしい。お手本にするから。

253 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:09:30 ]
>>245
fgetsで文字列を読み込んだり、コマンドライン引数を受け取ったりした際に
得られた文字列長を調べるための、strlenより高速で信頼性のある方法を教えてくれまいか?

254 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 20:59:09 ]
freadを使う



255 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:05:14 ]
それはstrlenより高速で信頼性のある方法なのか?

256 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:29:46 ]
>>253
まず、得られた文字列の長さを調べる必要が、本当にあるのかな。
次に、何かにつけてfgetsするのかな。

257 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:32:02 ]
必要あるからする

258 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:34:11 ]
本当は必要ないのに、必要だと思い込んでいる可能性を疑ってみた?

259 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:37:49 ]
もちろん

260 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:38:54 ]
で、strlenより高速で信頼性のある方法は?

261 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:44:29 ]
じゃぁ>>253は具体的にコードを例示してね。

262 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:50:37 ]
strlenより高速で信頼性のある方法マダー?

263 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:53:02 ]
strlenよりも高速で信頼性のあるstrlen互換の関数の話ではないぞ。

264 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 21:55:18 ]
基本的に、
気やすくstrlenやstrcpyを使わない
ってだけで、かなり速くなるし、安全性も高まる。




265 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:02:14 ]
strlenよりも高速で信頼性のあるstrlen互換の関数マダー?

267 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:07:14 ]
>>264
strlen,strcpyの安全性が低く感じるのは、呼び出し元の安全性が低いから。
速くなるってのは、一度取った長さを変数に入れておくとかってレベルの話かな?
いずれにしろ、これらに限らず「安易に使わない」って意味では同意できる。

268 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:25:48 ]
>>267
> strlen,strcpyの安全性が低く感じるのは、呼び出し元の安全性が低いから。

人間はミスをするものだから、
機械的かつ強制的にチェックしなければ、
意味がない。

バッファの長さが十分であるという、
目に見えない約束なんてものは、
人間のミスには耐えられない。

> 速くなるってのは、一度取った長さを変数に入れておくとかってレベルの話かな?

そんな小手先の最適化ではなく、
strlenを本当に必要な場所でしか使わない、ということ。



269 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:28:11 ]
安易に使わないってどゆこと?

必要だから使うんじゃないか。代替手段があるというのか?


270 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:29:30 ]
>>269
実際にどんなコード書いてるの? 晒してみなよ。

271 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:32:33 ]
なんかボーっとしてる間に、えらいスレ進んでてびっくりだ。
253と271とコレ以外は俺じゃないんで一応。

273 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:36:16 ]
>>271
それは
「何かにつけてstrlenする」
には該当しないと思うが。

274 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:37:17 ]
>>272
すまんね >>257>>259は俺だ
君の振りをしたつもりは無いんだけどね



275 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:50:29 ]
こんなどうでもいいことを真剣に議論してるw
ワラタw

276 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:53:27 ]
それはよかった

277 名前:デフォルトの名無しさん mailto:sage [2007/08/27(月) 22:55:12 ]
>>273
>>243に対して>>245だったから、strlenを全否定してるように見えたんで、
「まぁ使うんじゃないの?」ぐらいの感じで書いただけだよ。

ループ内とかで同じ文字列に対して何度もstrlen呼んだりとか
そういうのは無駄だと思うよ。

278 名前:デフォルトの名無しさん [2007/08/28(火) 22:18:22 ]
結論は出ましたか。

279 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:23:56 ]
結論:
sizeof(char)は省略してもいい
strlenは必要な場合もある

280 名前:デフォルトの名無しさん mailto:sage [2007/08/28(火) 22:28:44 ]
上げんな糞
>>1死ね

281 名前:デフォルトの名無しさん [2007/08/28(火) 23:30:57 ]
adobePの新作期待age

282 名前:デフォルトの名無しさん [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:23:30 ]
まあCとC++に限って言えば100% 1だからなぁ

284 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:26:43 ]
いい加減ループしすぎ。



285 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:27:14 ]
まぁスレタイがねループしてくださいって言ってるようなもんだからね

286 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:29:27 ]
ループといえば for(;;) と while() の戦争もあったな
オレは意味なくdo〜while派だけど

287 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:38:39 ]
じゃあ俺はgotoを使うぜ!

288 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 01:41:03 ]
三木は3つまでしかまとめられなかったので 3岐
後藤は5匹を統括してたから 5統

289 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 06:16:09 ]
ナツカシス

290 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 06:40:54 ]
ネオジオは100メガビット

291 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 07:43:01 ]
>>288
三木は右手だからじゃなかったっけ?

292 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 11:02:31 ]
それもあるな
なんかこう言葉遊びもあそこまで行くと芸術レベルだよな

293 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 13:07:42 ]
>>284
今頃ノコノコ出てきて画期的なご意見を述べて行かれる
>>282 みたいな間抜けがいる限り、ループは不滅です。

294 名前:デフォルトの名無しさん [2007/08/29(水) 21:26:11 ]
exit(0);



295 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 21:49:41 ]
いまどきマロックなんか使うかよw
newを使えnewを!

296 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 22:22:16 ]
VirtualAllocは多用しますが何か?

297 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:13:24 ]
sizeof(char)+1が必ず2でも、省略すべきではない
pc11.2ch.net/test/read.cgi/tech/1187521586/

298 名前:デフォルトの名無しさん mailto:sage [2007/08/29(水) 23:20:02 ]
再帰

299 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 19:28:14 ]
おもしろいことに、関心と一般の議論の大きさは、
機能の重要性と反比例していることが多い。
その理由は、大きな機能より小さな機能のほうが明確な意見を持ちやすく、
流行のような、一時的な関心を引きやすいからだ。
〜〜Bjarne Stroustrup『C++の設計と進化』

300 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 22:41:51 ]
>>299
そして、プログラムとは、小さな機能を集めて大きな機能を実現していく。
だから、小さな機能を議論することは、最終的に大きな機能
そして、重大な機能を議論することにつながるのである。

301 名前:デフォルトの名無しさん mailto:sage [2007/08/30(木) 23:39:17 ]
ああいえば上祐

302 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 00:56:46 ]
ttp://msdn2.microsoft.com/ja-jp/library/xa1a1a6z(VS.80).aspx

世界一巨大なソフトウェア会社のコーディング例では、
len = _vscprintf( format, args ) // _vscprintf doesn't count
+ 1; // terminating '\0'
buffer = malloc( len * sizeof(char) );
のように、sizeof(char)を省略していない。

303 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:34:46 ]
dist.dc.kumamoto-u.ac.jp/~km3534/12/index.html
の問題2
「自分なりの理由」があればどちらでも良い。
という答えな気がする。

304 名前:デフォルトの名無しさん mailto:sage [2007/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 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:50:23 ]
>>304
まあね、書くのならこのスレの様に
sizeof(char)*(n+1)
のようにヌル文字分も含めるべきだね。

306 名前:デフォルトの名無しさん mailto:sage [2007/08/31(金) 01:53:05 ]
>>303
どうしようもない問題集だな。特に問題4の辺りは終わっている。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<137KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef