タグ

cに関するkuro_m88のブックマーク (9)

  • [迷信] scanf ではバッファオーバーランを防げない | 株式会社きじねこ

    株式会社きじねこは大阪のソフトウェア開発会社です。組込み系・業務系のプログラム開発から電子回路の設計までおまかせください。 これも根が深い迷信です。この迷信を根拠に、scanf は使うべきではないという人も大勢います。おそらくこういうことでしょう。 char s[10]; scanf("%s", s); 確かにこれでは、ユーザーが10文字以上入力した時点で未定義の動作を引き起こしてしまいます。しかし、これは書式指定が不適切なために発生する脆弱性であって、scanf の問題ではありません。 バッファオーバーランを回避するには次のようにします。 char s[10]; scanf("%9s", s); これで差し当たっての問題はなくなりました。 さて、熱心な迷信の信者は、何とかして scanf の名誉回復を阻むために、巧みに論点のすり替えを行いながら、scanf を貶めようとすることでしょう。

  • Cでのポインタの読み方

    Cでのポインタの読み方 Cのポインタの読み方は、ルールを知らないと摩訶不思議です。 ルールを覚えれば、 int (*p[5])[3]; char (*(*fp)(void))(int); なんてのも解読する事ができます。 大事な前程 ポインタを読む際には、「英語で読む」必要があります。 「え~、英語~」 と思う方もいるかもしれませんが、逆に日語で読む方が大変です。 基ルール ルール 後置演算子が優先。 関数の() 配列の[] 前置はあとで。 要は、「後ろに何かあったら、後ろが優先」です。 演算子の英語での読み方 * pointer to ... () function returning ... [] array of ... Lesson 1 まず、演算子が単独で出てくる場合です。 Lesson 1-1 pointer to ... int *p; これは、まずpを見ましょう。 i

  • C言語における文字列連結 — KaoriYa

    C言語で文字列連結を行う。とても簡単に思えるけれど、実はパフォーマンスについて考えることもあるんだよ、というお話。 C言語で2つ文字列の連結して、1つの文字列にするプログラム(関数)を書けるでしょうか? ちょっとC言語でプログラミングを学んだことがあれば簡単ですよね。要求仕様としては2つの引数aとbをとり、どちらもNULターミネートな文字列で、その文字列をヒープから確保した領域で連結して戻り値として返す、という感じの動作です。ヨユーですね。ちょっと書いてみてください。 char* str_join(const char* a, const char* b) { char* p = malloc(strlen(a) + strlen(b) + 1); strcpy(p, a); strcat(p, b); return p; } こんな風に書いてしまったあなたは及第点です。個人的には失格です

  • [法大奥山研究室]C言語:17.2. volatile

    17.2. volatile volatile修飾型は,次の文法を持ちます。 非volatile修飾型の左辺値によって volatile修飾型のオブジェクトを参照する場合,未定義の動作となる。[C99, 6.7.3, 5] volatile修飾型は,処理系に不明な形で値が変更される可能性を持ち,それへのアクセスは処理系依存となる。[C99, 6.7.3, 6] プログラムの実行とは無関係に値が変化するデータという意味なのですが,仕様書(C99)だけでは良く分からないので,冗長にならない程度に説明を付します。 volatile は該当の変数に処理の最適化をしないようにコンパイラに知らせるためのものです。コンパイラは処理の最適化を試み,一部の変数を CPU のレジスタに割り当てたり,文を削除することがあります。次の例では,register を付していないにもかかわらず,変数 i が CPU

    kuro_m88
    kuro_m88 2011/07/11
  • 「CやC++の速度面における優位性は今後なくなる」という話

    Koichi Nakamura @9_ties 「CやC++の速度面における優位性は今後なくなる」というかむしろ他の言語に追い越されると思っているけど、ちゃんとその根拠を整理してみよう。 2011-05-20 00:25:27 Koichi Nakamura @9_ties CやC++はメモリ最適化と自動並列化が他の言語に比べて難しいから、ヘテロジニアスマルチコア向けの最適化がうまくできないというのは良いと思う。で、ハードウェアがどの程度上手く自動化してくれるか?が問題。ここの効率が良いなら別に言語は何でも良い。 2011-05-20 01:05:17

    「CやC++の速度面における優位性は今後なくなる」という話
  • scanf - Wikipedia

    scanf(スキャンエフ)は、C言語の標準関数。ヘッダーファイル stdio.h で定義されている、書式付き入力関数である。 標準入力(大抵はキーボード)からの入力を、書式に従って変数に読み込む機能を持つ。標準出力関数のprintfと対比させて考えると分かりやすい。 ユーザーからの入力を受ける、ごく基的な機能を持つにもかかわらず、後述するように異常入力(エラー)に配慮すると相応の手間がかかるため、テストプログラムや入門書を除いてはあまり使われない。 このファミリーの関数には、入力ストリームを指定できる fscanf や、メモリ上の文字列ストリームを入力対象とする sscanf などがある。

    kuro_m88
    kuro_m88 2011/05/19
  • i++ 及び ++i について - プログラマ専用SNS ミクプラ

    今まで気になっていたことを質問したいと思います。 (内容は雑談的なものなので雑談で立てさせていただきます) よく、 for(i = 0;i < 100;i++){ // ループ処理 } のように、入門書などでは、 i++ がほとんどですが、 for(i = 0;i < 100;++i){ // ループ処理 } のような記述はほとんど見られません。(処理の結果は同じ) ちなみに、 i++ → i を渡してから i に +1 ++i → i を +1 してから i を渡す という意味があります。 (これでわかるでしょうか…) 他の言語では ++i を使えないものもあるようなので、使われていないようなのですが、 皆様は ++i を使っているのでしょうか? 私は両方使っています。 あと、VC++などの新しいコンパイラでは、最適化により i++ と ++i との速度の差はなくなるようです。 BCC

  • ホワット・ア・ワンダフル・ワールド strict aliasing rule

    来週からは後期スタートだというのに,生活ペースはメチャクチャ.昨日は 17 時に起きてしまい,今日は 22 時半ごろに起きてしまった今日この頃,皆様いかがお過ごしでしたでしょうか ? まぁ,順調に 6 時間ずつズレているので,明日には元に戻るかなと. しっかし,なんで夜型の方には一瞬で 6 時間とか 12 時間とか平気でズレるのに,朝方の方には意識しないと絶対にズレないんでしょうかね ? まぁ,朝の 3 時とかにバリバリ活動しているってのは,ある意味朝型と言えなくもないような (ことはない). 僕は夜はあんまり生産的な方面にやる気が出ない人なので,夜型になると研究がさっぱり進まないと言う.いろいろ危機です. あと,Debian にテキトーなパッケージをいっぱい突っ込んでいたら,何故か日語の TTF (フォント) が表示されなくなってしまいました.そんなこんなで今はビットマップな生活なんで

  • codepad

    codepad is an online compiler/interpreter, and a simple collaboration tool. Paste your code below, and codepad will run it and give you a short URL you can use to share it in chat or email. Language: C C++ D Haskell Lua OCaml PHP Perl Plain Text Python Ruby Scheme Tcl

    kuro_m88
    kuro_m88 2011/01/10
    Web上でプログラムをコンパイルして実行して結果を返してくれる
  • 1