[過去ログ]
sizeof(char)が必ず1でも、省略すべきではない (683レス)
sizeof(char)が必ず1でも、省略すべきではない http://mevius.5ch.net/test/read.cgi/tech/1187521586/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
1: デフォルトの名無しさん [sage] 2007/08/19(日) 20:06:26 malloc(sizeof(char)*(strlen(s)+1)) ではなく malloc(strlen(s)+1) と書くような糞コードばかり見て育った、 悪しき慣習を引きずった人は引退すべし http://mevius.5ch.net/test/read.cgi/tech/1187521586/1
31: デフォルトの名無しさん [sage] 2007/08/19(日) 23:18:49 いちいち hoge = (type*)malloc(sizeof(type)*size) ; なんて書いてる人いるの? 初心者だって、 #define MALLOC(type, size) ((type)*)malloc(sizeof(type)*(size)) くらいして、 hoge = MALLOC(char, strlen(s)+1) ; って書くだろ? だいたい、いまどきCオンリーなんて、なにか理由があるときくらいなもので、 普通はC++だから、文字列クラスを使うだろう。 いまだにチマチマとstrlenとかstrcpyとかやってるから、 つまらないバグやセキュリティホールを作り込んでしまうんだよ。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/31
40: デフォルトの名無しさん [sage] 2007/08/20(月) 00:00:32 >>32 たまたま 文字数==バイト数 なだけじゃん。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/40
49: デフォルトの名無しさん [sage] 2007/08/20(月) 00:29:47 >>47 malloc(strlen(s) + sizeof(char)) って書くってこと? http://mevius.5ch.net/test/read.cgi/tech/1187521586/49
53: デフォルトの名無しさん [sage] 2007/08/20(月) 00:46:53 >>49 どこから、そういう発想がでてくるのだろ。 size_t CalcRequiredMemoryForString(const char* s) { return sizeof(char)*(strlen(s)+1) ; } もっと細かく分けて size_t ScanAscizStringLength(const char* s) { return strlen(s)+1 ; } size_t CalcRequiredMemoryForString(const char* s) { return sizeof(char)*ScanAscizStringLength(s) ; } とかでもいい。 そしたら、 char* s2 = malloc(CalcRequiredMemoryForString(s)) ; と書けるようになるっしょ。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/53
62: デフォルトの名無しさん [sage] 2007/08/20(月) 01:13:01 >>59 C++でもmalloc使う人いるんだよねぇ。 > >>49 程度で済ました方が良いと思う。 strlen(s) + sizeof(char) これこそ意味不明だねぇ。 1文字分ってことなら、 sizeof(char) ではなく sizeof(char)*1 としないとねぇ。 そうするなら sizeof(char)*(strlen(s)+1) になるわなぁ。 > その関数名だと長すぎて使いたくない。 いちいち手でタイプする人いるんだよねぇ。 ミスタイプしたりするからコピペが基本よ。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/62
75: デフォルトの名無しさん [sage] 2007/08/20(月) 11:52:25 >>71 #include <stdio.h> int main() { printf("%d\n",sizeof(char)); return 0; } をCでコンパイルしてみたか? C++でもコンパイルしてみたか? http://mevius.5ch.net/test/read.cgi/tech/1187521586/75
100: デフォルトの名無しさん [sage] 2007/08/20(月) 17:39:16 外人は文字が2バイトかもしれないなんて考えてないから、 strlenという関数名なんだろ。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/100
124: デフォルトの名無しさん [sage] 2007/08/20(月) 20:43:43 >>100 >>107 UTF-16とか思い出してあげてください。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/124
180: デフォルトの名無しさん [sage] 2007/08/24(金) 20:52:42 文法的にも、プログラム的にも、省略するのは間違いではない。 だが、 プログラムを人間が読んで理解する上では、省略しないほうがよい。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/180
187: デフォルトの名無しさん [sage] 2007/08/25(土) 14:24:25 #define SZCHAR 1 p = (char*)malloc(SZCHAR*strlen(ps)); if(p == NULL) { return ERR; } こうすればいいじゃね http://mevius.5ch.net/test/read.cgi/tech/1187521586/187
201: デフォルトの名無しさん [sage] 2007/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に渡すときはそれを 使ってバイトサイズに変換しろっていうまとめをするとすれ違いにならないかな? http://mevius.5ch.net/test/read.cgi/tech/1187521586/201
231: デフォルトの名無しさん [sage] 2007/08/27(月) 01:09:02 お前ら、こんな下らない話で、よくここまでスレを伸ばしたなぁ。 いまどきmallocとstrlenを散在させるようなコードを書くほうがオカシイ。 strlenなんて使うか? ふつー。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/231
245: デフォルトの名無しさん [sage] 2007/08/27(月) 16:17:20 >>243 何かにつけてstrlenする、糞遅くて信頼性の低いプログラム書いてるのか。ご苦労さまです。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/245
303: デフォルトの名無しさん [sage] 2007/08/31(金) 01:34:46 http://dist.dc.kumamoto-u.ac.jp/~km3534/12/index.html の問題2 「自分なりの理由」があればどちらでも良い。 という答えな気がする。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/303
321: デフォルトの名無しさん [sage] 2007/08/31(金) 15:12:04 また1つごみを見付けたんで記念カキコ http://msdn2.microsoft.com/ja-jp/library/y0cka9es(VS.80).aspx pszSrc= new char(12); if(pszSrc) pszSrc= "Hello world!"; http://mevius.5ch.net/test/read.cgi/tech/1187521586/321
328: デフォルトの名無しさん [sage] 2007/08/31(金) 19:35:39 >>321は良い踏み絵だな 判ってない奴が浮き出てきた http://mevius.5ch.net/test/read.cgi/tech/1187521586/328
354: デフォルトの名無しさん [sage] 2007/09/03(月) 22:57:44 突然だがスレを激しくrollbackしていいかな。 sizeof(char)は確かに仕様で1と決まっているけど、省略しない方が良い。 コメントやsizeof(char)==1の理解が無くても、 ソースを見るだけで文字数→バイト数として扱いたい意図が明確になる。 それにコンパイラの最適化でどうせコストは0だ。 ただ、そんな冗長なソースが散在しているのが嫌だというのも同意出来る。 しかしそれ以前に、文字列の操作なんて普通はラップしないか? >malloc(sizeof(char)*(strlen(s)+1)) >malloc(strlen(s)+1) 両方とも、非常に短い関数以外でこんなん出てきたらどうかと思うんだが。 char* strmalloc(int len){return len<0?NULL:malloc((len+1)*sizeof(char ));} wchar_t* wcsmalloc(int len){return len<0?NULL:malloc((len+1)*sizeof(wchar_t));} void strfree(const char* s){free(s);} // 確保/解放を対とするためfreeを単純にラップ void wcefree(const wchar_t* s){free(s);} // 確保/解放を対とするためfreeを単純にラップ char* s2 = strmalloc(strlen(s)); strfree(s2); これくらいは抽象化するだろ?お前らどうやってる? http://mevius.5ch.net/test/read.cgi/tech/1187521586/354
415: デフォルトの名無しさん [sage] 2007/09/29(土) 23:17:00 ところで、sizeof(char)=sizeof(short)=sizeof(int)=2っていう設定のトンデモコンパイラがあるらしい。 一応、C言語の規格上これは間違っていない。(型のサイズは決められてないからね。) http://mevius.5ch.net/test/read.cgi/tech/1187521586/415
469: デフォルトの名無しさん [sage] 2008/03/24(月) 23:46:10 >>468 セキュリティに限らず、いかにバグの入り込む余地を減らすか、ってこと。 余地が少なければ、バグの有無を確認するための工数が減るわけよ。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/469
474: デフォルトの名無しさん [sage] 2008/03/25(火) 15:27:34 >>473 printfに限った話ではないし。 int height ; int weight ; 中略 height = weight ; こういうのを機械的に検出できるかどうかは、 微々たる事ではあるが、 ソフトウェアの規模が大きくなってくると重要よ。 http://mevius.5ch.net/test/read.cgi/tech/1187521586/474
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
1.385s*