X



sizeof(char)が必ず1でも、省略すべきではない
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2007/08/19(日) 20:06:26
malloc(sizeof(char)*(strlen(s)+1))
ではなく
malloc(strlen(s)+1)
と書くような糞コードばかり見て育った、
悪しき慣習を引きずった人は引退すべし
0534デフォルトの名無しさん
垢版 |
2008/03/30(日) 16:27:19
ていうかmallocするとバグの元になるから
そもそもなるべくmallocしないで済む設計にするのがいいよ
0538デフォルトの名無しさん
垢版 |
2008/03/30(日) 21:53:52
> なんで明らかにダメな方向に誤解して、その誤解の上でしか成りたたない反論をするんだろ。
0542デフォルトの名無しさん
垢版 |
2008/06/12(木) 07:39:29
typedef int WEIGHT;
typedef int HEIGHT;

WEIGHT weight;
HEIGHT height;

height = weight; // warning: 型の異なる代入ですというコンパイラは存在するのか
0545デフォルトの名無しさん
垢版 |
2008/06/15(日) 00:44:21
>>543
そう言う問題じゃなくて、POD であることはわかってるけど、
プログラマが別の型と定義したんだから、 警告するようにすれば
身長 × 体重 なんてしてしまうバグを減らせると言うことなんだ
ろう。

>>542
言語は違うけど、Pascal とか Ada はそう言う型を定義できる。
現状の枠内でやろうとするなら、>>544 の方法がいいと思う。
0550デフォルトの名無しさん
垢版 |
2008/09/18(木) 07:56:04
独自の拡張にメリットを見い出せないからこそBOOST(ライブラリ)やD(派生言語)でstrong typedefを実現しているのだけれど
>>547
間抜けだという理由をどうぞ
さぞかし説得力のある解説をして下さるのだろう

単純に既存のC/C++処理系の拡張としてtypedef警告が実装されていたら
WindowsやOpenGLのプログラムなんてやってられないと思うのだがね
0556デフォルトの名無しさん
垢版 |
2008/10/20(月) 09:05:31
馬鹿な>1っているもんだな
0559デフォルトの名無しさん
垢版 |
2009/09/02(水) 02:43:32
いいえいいえ
0561デフォルトの名無しさん
垢版 |
2009/09/04(金) 00:55:35
strncpy(str1, str2, str2 - strrchr(str2, '.'))
みたいな場合でも、
strncpy(str1, str2, sizeof(char) * (str2 - strrchr(str2, '.')))
とか書かなきゃならんか?

アホらし。
0562デフォルトの名無しさん
垢版 |
2009/09/04(金) 02:02:02
>>561
いやそこはだめだろ。memcpyではあるまいし。
wchar_t版でもなんでもそこでsizeofをかける必要はないぞ。
0564デフォルトの名無しさん
垢版 |
2009/09/04(金) 07:29:42
sizeof(char)をかけるのではなく,
sizeof(char)で割らなきゃいけないところか?
普段Cでマルチバイトとか使ってないんでよくわからん。
0565デフォルトの名無しさん
垢版 |
2009/09/04(金) 11:26:20
str2 - strrchr(str2, '.') の結果は「文字数」だが
strncpy の第3引数もまた「文字数」(バイト数ではない) だからな。
0569デフォルトの名無しさん
垢版 |
2011/11/24(木) 21:22:09.71
もう4年も前なのか
0572デフォルトの名無しさん
垢版 |
2011/11/29(火) 13:44:44.78
>>570
すげぇ
これにコンパイル通るのか・・・こえぇなぁ
これやっちゃったあとってもうcharは復活する手段無し?
0580デフォルトの名無しさん
垢版 |
2012/09/05(水) 19:13:46.94
sizeof(char)と書いてあればテンプレート化の際に
sizeof(T)に置換し易い

シンタックスでセマンティクスを表せるなら
それを使った方が人にも機械にも認識しやすいコードになる
0581デフォルトの名無しさん
垢版 |
2012/09/05(水) 19:57:02.45
charが常に1バイトなことを理解できてなかった奴が
無理やりあとからこじつけてるようにしか見えないな
0582デフォルトの名無しさん
垢版 |
2012/09/06(木) 10:45:40.63
1バイト単位で処理したいときがどうしても出るから、
charが1バイトじゃなくなったら、どうすんの?ってかんじだなw
(char *)にキャストしてクリクリとポインタ進める動きが大事だろ。
0590デフォルトの名無しさん
垢版 |
2014/02/26(水) 21:48:50.86
charが1でない環境でコンパイルされる可能性のあるときだけ気をつければよい
0591デフォルトの名無しさん
垢版 |
2014/02/28(金) 09:37:27.66
>>1の理論によると、sizeof(long)も4と書いてはいけないことになる。
ありえない。
0593デフォルトの名無しさん
垢版 |
2014/03/01(土) 09:06:38.21
自分しかコンパイルしなくて
しかもそのコンパイルする環境でlongが4ならそれでいいだろ
いちいちsizeof関数が実行されないぶん高速化されるわけだし
0597デフォルトの名無しさん
垢版 |
2014/03/02(日) 17:49:41.62
何のサイズかはどうでもいいんだよ
必要なサイズが確保されていればそれでいい
0598デフォルトの名無しさん
垢版 |
2014/03/04(火) 21:16:10.83
何?
C言語ってアセンブラまで見なきゃいけないの?
0599デフォルトの名無しさん
垢版 |
2014/03/04(火) 22:09:37.32
いけないのです。
実用的にCを使うならアセンブラは必修です。
0602デフォルトの名無しさん
垢版 |
2014/03/06(木) 17:46:11.78
めんどくさ
0603デフォルトの名無しさん
垢版 |
2014/03/08(土) 20:56:19.16
アセンブラできる俺かっけー!したいだけにしか見えない
0604デフォルトの名無しさん
垢版 |
2014/03/08(土) 21:15:37.05
ANSI/ISO/JISでは、sizeof( char )は1、と定義されているけど
俺は標準規格がいつ変更になってもいいように
sizeof( char ) は書くようにしている。
0606,,・´∀`・,,)っ-○○○
垢版 |
2014/03/08(土) 21:44:58.40
wchar_tがあるからcharのサイズが変わることは無いしかえる必要性も無い
逆に変えちゃうと1バイトを表すプリミティブ型がほかに無くなってしまう。
(新しい規格にはbyte_tとかあったっけ?)

むしろサイズが変わったときのことを考えるなら
charをそのまま使わずtypedefして使えって思うけどw
0607デフォルトの名無しさん
垢版 |
2014/03/08(土) 21:47:09.16
> 逆に変えちゃうと1バイトを表すプリミティブ型がほかに無くなってしまう。

そうそうれ。おれはそれが理由で安心して省略してる。
0608デフォルトの名無しさん
垢版 |
2014/03/08(土) 21:50:55.80
へーダンゴちゃんは物知りだねえ。
0610,,・´∀`・,,)っ-○○○
垢版 |
2014/03/08(土) 22:06:22.14
大丈夫だよ
C#のコードをそのままCに持ってきてもたいがい
コンパイルすら通る見込みはないから
0611デフォルトの名無しさん
垢版 |
2014/03/10(月) 23:23:15.92
>>606
int iSize = strlen( pName );
char* pBuf = (char*)malloc( iSize+1 );
strcpy( pBuf, pName );
で、もし sizeof( char ) が1じゃなくなったら
メモリを壊すだろ
0612,,・´∀`・,,)っ-○○○
垢版 |
2014/03/11(火) 00:07:57.69
> で、もし sizeof( char ) が1じゃなくなったら


これはありえない仮定を持ち出すという詭弁だな

なぜcharのサイズを変える必要があるのか
wchar_tを用意したからcharのサイズは今のままでいい
という発想が欠落した無能人間乙としか
0613,,・´∀`・,,)っ-○○○
垢版 |
2014/03/11(火) 00:10:44.17
大体にstrlen + malloc + strcpyじゃなくてstrdup使えば1行ですむだろ
そんな無駄なコードを得意げに書くから実力がつかないんだよ

てかいくらバカでもstrncpy使うわ
0616,,・´∀`・,,)っ-○○○
垢版 |
2014/03/11(火) 08:19:22.80
何がダメかって書いておくわ

1.ドヤ顔で言う割りにmallocがNULLを返したときの処理を考慮してない
(strdupはメモリ確保失敗時点でコピー操作を止めてくれる)

2.strcpyはいちど走査するまでソース文字列の終端がわからない。
なので、1バイトコピーするごとに終端文字判定が必要になる。
(あるいは、また内部でstrlenですか?)

strncpyというよりはmemcpyが一番無駄がないのかな。
コピー終端がわかっているので、終端までの間は大きなワードサイズでの
コピー操作を行うことができる
(x86ならmovntdqで16バイトずつコピーするのが最速ですよ)





で、そもそもchar配列のサイズのことを考慮するのであれば
   sizeof (char)
ではなく、
   sizeof hoge_str[0]
じゃないとダメだろ?
単体のcharのサイズとchar配列の1要素のパディングサイズが将来にわたって
同じである保障がどこにある?

結論:お前らのクソ宗教は不完全
0617デフォルトの名無しさん
垢版 |
2014/03/11(火) 12:45:37.33
>>,,・´∀`・,,)っ-○○○

メモリーの破壊例として
やっつけで書いたと思われるサンプルコードにそこまで噛み付くとは
マジで必死だな
m9(^Д^)プギャー

俺はお前と同類と思われたくないからsizeof(char)を省略しないことにする
0618,,・´∀`・,,)っ-○○○
垢版 |
2014/03/11(火) 19:44:41.10
↑お前は同一人物か同レベルのアホだと自分で証明してるわけだが。

sizeof (char)を別に書こうが書くまいがどっちでもいい
そんなことで無駄な時間を費やすなというだけで

書かなきゃいけない理由の説明が不適格だと指摘してるだけだよ


> で、もし sizeof( char ) が1じゃなくなったら

このDQNな仮定の致命的な欠陥の理由をもう一つだけ指摘しよう
charのサイズが変わってしまうと、ASCIIやUTF-8など8ビット単位のエンコードの
テキストを読み書きしてるプログラムがほぼ全滅してしまうわな。

これはsizeof(char)を入れれば解決という話ではない
sizeof(char) == 2になるとfgetcで2文字分入ってきてしまう。
もともとASCII文字列の1文字を1データとしてマッピングできる型としてchar型が
あるわけでそれ以上でもそれ以下でもない。

charのサイズは変わるかもしれないものではなく「変えてはいけない」のが
C/C++の仕様であって、おそらく地球上のどこにも存在しない
標準規格を守らないコンパイラの挙動を考慮しろなんてヴァカな話はない。
0619デフォルトの名無しさん
垢版 |
2014/03/11(火) 20:37:02.31
そもそも >>1 * sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char)
sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) *
sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) *
sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) *
sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) *
sizeof (char) * sizeof (char) * sizeof (char)をはじめとする sizeof (char)を
書く派の言い分が総じておかしいのは「省略する」という考え方そのものよ。
本質的に必要のない式を付加してるだけにすぎないのに。

タイプ量が増えるしコードが長くなって幅をとったり行が長くなるだけで
何一つメリットがない。
むしろわざわざ * sizeof(char) をつけてる人のコードの品質こそ逆に俺は
信用しないことにしている。
仕様を理解せずに書いてる可能性が高いってことだからな。

WindowsでUnicode APIベースのプログラム書いててもASCIIデータは扱うし
Unicode移植時にcharの操作を機械的にすべてwchar_tに置換すればいい
って発想もたいがい危い。

とりあえず規格で決まってるcharのサイズが変更される確率は限りなく0 *
sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) *
sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) *
sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) *
sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) * sizeof (char) *
sizeof (char) * sizeof (char) * sizeof (char) に等しいことは確定的に明らか。
0621,,・´∀`・,,)っ-○○○
垢版 |
2014/03/11(火) 22:38:20.94
そんなしょっちゅうstrlenやらなきゃいけないコード書くならヒープ領域自体に
サイズを格納して管理しようぜ。

typedef char* OreoreString;
#define OreoreStringSize(buf) (*(uint32_t*)(buf-4))
#define OreoreStringRewriteSize(buf, newSize) (*(uint32_t*)(buf-4) = newSize)

OreoreString OreoreStringAlloc(size_t n) {
  char* buf = malloc(n + 4);
  if (!buf) return NULL;
  *((uint32_t*)buf) = n;
  return buf + 4;
}
void OreoreStringFree(OreoreString buf) {
  free(buf - 4);
}
OreoreString OreoreStringDuplicate(OreoreString src) {
  int size = OreoreStringSize(src);
  char* cpy = malloc(size + 4);
  if (cpy) memcpy(cpy, src-4, size);
  return cpy;
}

こんなコードをだいがくいちねんせいくらいに書いたことがあったが
なにげにMacのCoreFoundationの文字列がこれに近いデータ構造に
なってるんだよな。
NULL終端つけておけば普通のC文字列関数も使えるし。
0624 ◆0uxK91AxII
垢版 |
2014/03/12(水) 01:09:58.95ID:yJrX5exL
>>621
sizeof (uint32_t)が4より大きくなったらどうするんだ!!1!
0626,,・´∀`・,,)っ
垢版 |
2014/03/12(水) 02:20:54.98ID:DWO9DKRE
>>624
名前通りのサイズにならないデータ型ってある意味面白いなwwww
typedefの意味なすwwww
stdint.hの定義がおかしいトンデモ処理系で正常に動くことなんてプログラマが
保障する必要ないよね。

たしかにBSTRも確かにPASCAL文字列+C文字列のハイブリッド的な実装だ。
個人的に文字列処理でCは使いたくない。C++の煩雑さもたいがいだけど。
0629,,・´∀`・,,)っ
垢版 |
2014/03/12(水) 19:27:22.15ID:DWO9DKRE
628 * sizeof(char) * sizeof(char) * sizeof(char) * sizeof(char) * sizeof(char)
が「省略」とかあほなことを言ってますよ
0630,,・´∀`・,,)っ
垢版 |
2014/03/12(水) 19:33:34.10ID:DWO9DKRE
もしsizeof(char)をかけなければいけないと主張してる奴の
トンデモ加減が理解できないならプログラマの才能ないよ

仕様の意味を深く理解せずにプログラム書いてる奴のコードの品質なんて
総じて低い。
0631デフォルトの名無しさん
垢版 |
2014/03/12(水) 21:06:01.62ID:4AbABLKQ
>>628
痛いのは省略派じゃないぞ。例えば>629-630のことなら
そもそも省略なんて言っちゃうのがどうかしているんだぞ派とでも言うべきだw
0632,,・´∀`・,,)っ
垢版 |
2014/03/12(水) 21:16:24.57ID:DWO9DKRE
switch (n) {
case(1): 〜
case(2): 〜
case(3): 〜
}
return(0);
とかわざわざ括弧をつける奴とか

for (i = 0; i < I_MAX; i++) {
  for (j = 0; j < J_MAX; j++) {
     for (k = 0; k < K_MAX; k++) {
        /* 何かしらの処理 */
        if (cond) {
          break_flag = 1;
break;
        }
     }
     if (flag) break;
  }
  if (flag) break;
}

↑みたいな、gotoを使ったほうがよっぽどきれいに書けるコードを平気で書く奴とか
(そもそもK&Rでも多重ループを抜けるときにgotoを使うのはむしろ推奨されている)

もっと強烈な奴だと
#define then
#define begin {
#define end }
みたいなマクロを定義して「PASCAL風だ!」とドヤ顔する奴とか
このスレの1とその同意者みたいな、意味も無く式に sizeof (char) を掛ける奴とか
みんな、頭弱いんですよ。
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況