sizeof(char)が必ず1でも、省略すべきではない
■ このスレッドは過去ログ倉庫に格納されています
malloc(sizeof(char)*(strlen(s)+1))
ではなく
malloc(strlen(s)+1)
と書くような糞コードばかり見て育った、
悪しき慣習を引きずった人は引退すべし
ていうかmallocするとバグの元になるから
そもそもなるべくmallocしないで済む設計にするのがいいよ そのライブラリを呼び出すコードがバグの元になるから... > なんで明らかにダメな方向に誤解して、その誤解の上でしか成りたたない反論をするんだろ。 >>474 が書いたコードを見てみたい・・・
何か放流してくれないかな? typedef int WEIGHT;
typedef int HEIGHT;
WEIGHT weight;
HEIGHT height;
height = weight; // warning: 型の異なる代入ですというコンパイラは存在するのか そういうのはクラス化するという例をEffective C++で最近読んだ。
>>543
そう言う問題じゃなくて、POD であることはわかってるけど、
プログラマが別の型と定義したんだから、 警告するようにすれば
身長 × 体重 なんてしてしまうバグを減らせると言うことなんだ
ろう。
>>542
言語は違うけど、Pascal とか Ada はそう言う型を定義できる。
現状の枠内でやろうとするなら、>>544 の方法がいいと思う。 strong typedefを知らずにこんなスレに書き込む奴がいたのか
2008年だぞ今年… 後からのこのこ現れて間抜けな事を書き捨てていく奴って何なの?
流行ってんの? 独自の拡張にメリットを見い出せないからこそBOOST(ライブラリ)やD(派生言語)でstrong typedefを実現しているのだけれど
>>547
間抜けだという理由をどうぞ
さぞかし説得力のある解説をして下さるのだろう
単純に既存のC/C++処理系の拡張としてtypedef警告が実装されていたら
WindowsやOpenGLのプログラムなんてやってられないと思うのだがね 3ヶ月も経ってからレスしてたらやっぱり間抜けだろ。 >>551
わざわざ煽りレスして理由がそれってのは苦しいと思うが… IDないと句読点や三点リーダの不備が余計目立つな。 #define strlen(a)
って宣言してみる。 どちらでもいい、という結論を受け入れられない人って結構困るよな strncpy(str1, str2, str2 - strrchr(str2, '.'))
みたいな場合でも、
strncpy(str1, str2, sizeof(char) * (str2 - strrchr(str2, '.')))
とか書かなきゃならんか?
アホらし。
>>561
いやそこはだめだろ。memcpyではあるまいし。
wchar_t版でもなんでもそこでsizeofをかける必要はないぞ。 >>560
2chはいっぱい居るねー、そういう固い人 sizeof(char)をかけるのではなく,
sizeof(char)で割らなきゃいけないところか?
普段Cでマルチバイトとか使ってないんでよくわからん。 str2 - strrchr(str2, '.') の結果は「文字数」だが
strncpy の第3引数もまた「文字数」(バイト数ではない) だからな。 #define char long
main(){ printf("%d",sizeof(char));} >>570
すげぇ
これにコンパイル通るのか・・・こえぇなぁ
これやっちゃったあとってもうcharは復活する手段無し? 信頼できないソースで
#undef char
#undef short
#undef int
#undef long
とか胸熱
>>570でこのスレの議論終了
sizeof(char) == 1とか言ってたやつ涙目 >>1
コンピューターサイエンスに対する適性が薄そうな雰囲気が漂っている sizeof(char)と書いてあればテンプレート化の際に
sizeof(T)に置換し易い
シンタックスでセマンティクスを表せるなら
それを使った方が人にも機械にも認識しやすいコードになる charが常に1バイトなことを理解できてなかった奴が
無理やりあとからこじつけてるようにしか見えないな 1バイト単位で処理したいときがどうしても出るから、
charが1バイトじゃなくなったら、どうすんの?ってかんじだなw
(char *)にキャストしてクリクリとポインタ進める動きが大事だろ。 >>581
明白でも書くべきという主旨が理解出来なかったか
文盲は悲しいな charが1でない環境でコンパイルされる可能性のあるときだけ気をつければよい >>1の理論によると、sizeof(long)も4と書いてはいけないことになる。
ありえない。 そりゃぁ、いかんだろ。sizeof(long)は4だと決まっているわけではないのだから。 自分しかコンパイルしなくて
しかもそのコンパイルする環境でlongが4ならそれでいいだろ
いちいちsizeof関数が実行されないぶん高速化されるわけだし >>593
sizeof 演算子使ってるところのアセンブラ見てみ。
あ、答え書いちゃった。 何のサイズかはどうでもいいんだよ
必要なサイズが確保されていればそれでいい 何?
C言語ってアセンブラまで見なきゃいけないの? いけないのです。
実用的にCを使うならアセンブラは必修です。 全てのコンパイラが同じコード吐くとでも思ってるのか 違うコードを吐くからこそ自分で目視確認しなければならない。 アセンブラできる俺かっけー!したいだけにしか見えない ANSI/ISO/JISでは、sizeof( char )は1、と定義されているけど
俺は標準規格がいつ変更になってもいいように
sizeof( char ) は書くようにしている。 wchar_tがあるからcharのサイズが変わることは無いしかえる必要性も無い
逆に変えちゃうと1バイトを表すプリミティブ型がほかに無くなってしまう。
(新しい規格にはbyte_tとかあったっけ?)
むしろサイズが変わったときのことを考えるなら
charをそのまま使わずtypedefして使えって思うけどw > 逆に変えちゃうと1バイトを表すプリミティブ型がほかに無くなってしまう。
そうそうれ。おれはそれが理由で安心して省略してる。 大丈夫だよ
C#のコードをそのままCに持ってきてもたいがい
コンパイルすら通る見込みはないから >>606
int iSize = strlen( pName );
char* pBuf = (char*)malloc( iSize+1 );
strcpy( pBuf, pName );
で、もし sizeof( char ) が1じゃなくなったら
メモリを壊すだろ > で、もし sizeof( char ) が1じゃなくなったら
これはありえない仮定を持ち出すという詭弁だな
なぜcharのサイズを変える必要があるのか
wchar_tを用意したからcharのサイズは今のままでいい
という発想が欠落した無能人間乙としか 大体にstrlen + malloc + strcpyじゃなくてstrdup使えば1行ですむだろ
そんな無駄なコードを得意げに書くから実力がつかないんだよ
てかいくらバカでもstrncpy使うわ 自覚の無いバカを黙らせるにはこれくらい言ってやらないとダメ 何がダメかって書いておくわ
1.ドヤ顔で言う割りにmallocがNULLを返したときの処理を考慮してない
(strdupはメモリ確保失敗時点でコピー操作を止めてくれる)
2.strcpyはいちど走査するまでソース文字列の終端がわからない。
なので、1バイトコピーするごとに終端文字判定が必要になる。
(あるいは、また内部でstrlenですか?)
strncpyというよりはmemcpyが一番無駄がないのかな。
コピー終端がわかっているので、終端までの間は大きなワードサイズでの
コピー操作を行うことができる
(x86ならmovntdqで16バイトずつコピーするのが最速ですよ)
で、そもそもchar配列のサイズのことを考慮するのであれば
sizeof (char)
ではなく、
sizeof hoge_str[0]
じゃないとダメだろ?
単体のcharのサイズとchar配列の1要素のパディングサイズが将来にわたって
同じである保障がどこにある?
結論:お前らのクソ宗教は不完全 >>,,・´∀`・,,)っ-○○○
メモリーの破壊例として
やっつけで書いたと思われるサンプルコードにそこまで噛み付くとは
マジで必死だな
m9(^Д^)プギャー
俺はお前と同類と思われたくないからsizeof(char)を省略しないことにする ↑お前は同一人物か同レベルのアホだと自分で証明してるわけだが。
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++の仕様であって、おそらく地球上のどこにも存在しない
標準規格を守らないコンパイラの挙動を考慮しろなんてヴァカな話はない。 そもそも >>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) に等しいことは確定的に明らか。 プリプロセッサで
KYARA_SAIZUとしていつでもきりかえられるようにしようそうしよう そんなしょっちゅう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文字列関数も使えるし。 >>621
sizeof (uint32_t)が4より大きくなったらどうするんだ!!1! >>624
名前通りのサイズにならないデータ型ってある意味面白いなwwww
typedefの意味なすwwww
stdint.hの定義がおかしいトンデモ処理系で正常に動くことなんてプログラマが
保障する必要ないよね。
たしかにBSTRも確かにPASCAL文字列+C文字列のハイブリッド的な実装だ。
個人的に文字列処理でCは使いたくない。C++の煩雑さもたいがいだけど。 俺氏、ここの書き込み見てsizeof(char)を
つけることを決意
省略派が痛すぎる 628 * sizeof(char) * sizeof(char) * sizeof(char) * sizeof(char) * sizeof(char)
が「省略」とかあほなことを言ってますよ もしsizeof(char)をかけなければいけないと主張してる奴の
トンデモ加減が理解できないならプログラマの才能ないよ
仕様の意味を深く理解せずにプログラム書いてる奴のコードの品質なんて
総じて低い。 >>628
痛いのは省略派じゃないぞ。例えば>629-630のことなら
そもそも省略なんて言っちゃうのがどうかしているんだぞ派とでも言うべきだw 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) を掛ける奴とか
みんな、頭弱いんですよ。 ■ このスレッドは過去ログ倉庫に格納されています