タグ

C言語に関するs_hiiragiのブックマーク (34)

  • malloc() が返すアドレスの下位数ビットは常に0って知ってます?

    当は「malloc() が返すアドレスは8の倍数って知ってます?」 にしたかったんだけど,「8」というのは CPU 依存の数字だし, 一般には2の冪乗なのでこういうタイトルにした. そもそもこの記事を書くきっかけは, YLUG の 「第67回カーネル読書会 (glibc malloc について)」の ビデオと資料を見たこと. 1985年頃に Lisp の処理系を作ろうとして (結局作らなかったけど(^^;)) メモリ管理方法について色々考えたアイディアと同じものもいくつか出てきて, 懐かしくもあり,またとても面白かったが, 私にとって目新しいアイディアは少なかった. malloc() の内部実装に興味を持つ人であっても, 意外と上記タイトルに書いた事実を知らない人が多いようなので, 「ビデオと資料」のページに色々とコメントした. この記事はそれを整理してまとめたものである. 2016/0

  • cpp-aligned-allocate

    C/C++でコーティングしていると、特定のサイズにアライメントされた領域が必要なることがありますよね。ハードウェアに近いところを実装してると「4KiBでアラインせよ」とか普通にありますね。 このようなアライメントされた領域を確保する方法はいくつかありますが、今回は可搬性の高い方法をいくつか紹介します。 posix_memalign 関数 これは名前の通り、POSIX準拠の関数ですので Unix や Linux などほとんどの環境で動作します。プロトタイプ宣言は int posix_memalign(void **memptr, size_t alignment, size_t size); です。 この関数は、引数 size(Byte)の大きさの領域を確保し、引数 memptr の指す先へ領域へのポインタを格納します。その領域は引数 alignment で指定した値でアライメントされていま

    cpp-aligned-allocate
    s_hiiragi
    s_hiiragi 2023/12/04
    “さらに、引数 size は 引数 alignment の倍数である必要があります。”
  • C言語での static キーワード付き配列パラメータ宣言

  • The "Clockwise/Spiral Rule" in C | Hacker News

    s_hiiragi
    s_hiiragi 2022/08/09
    “The "spiral rule" makes for pretty pictures, but unfortunately it isn't correct. One simple example:”
  • 複雑な宣言の読み方

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

    複雑な宣言の読み方
  • "Clockwise/Spiral Rule''を使ってC言語の複雑な宣言を理解する - Qiita

    はじめに この記事を書いたきっかけ こんにちは,私は社会人2年目の組み込みエンジニアの下積みです.さほど詳しくなかったC言語を格的に業務で使うようになって約9ヶ月,C言語って宣言が難しいな〜と思うようになりました.特に関数ポインタやダブルポインタ,その配列…などと考えるといくらでも複雑になります.例えば以下の画像のようなC言語の宣言に関する有名なジョークがありますね. これは勿論行き過ぎですが,多少複雑な宣言でも軽々と読めたらな,と調べる中で知ったのが表題の"Clockwise / Spiral Rule"です.これを使うと複雑な宣言でも結構簡単に読めてしまいます. しかしながら,調べてみると案外日語で解説された記事が無いんですね.そこで折角面白いルールなので記事にして投稿しようと思った次第です. (日語記事が周知の事実だから?それとも,あまり推奨されないような方法だから…?) この

    "Clockwise/Spiral Rule''を使ってC言語の複雑な宣言を理解する - Qiita
  • C言語のポインタを含む複雑な宣言を解読

    C言語の複雑な宣言の解読方法 C言語ポインタ完全制覇のp144「Cの宣言を解読する」という章で、C言語の複雑な宣言を解読する方法が、ずばり分かりやすく説明してあります。以下、引用&要約。英語で解読すると分かりやすいので、英語で考えること推奨です。 1. 識別子に着目し、英語で読む 2. 優先順位:識別子に近い方から次の優先順位に従って派生型(配列、関数、ポインタ)を解釈する。 1) 宣言をまとめる括弧 2) 配列の []、関数の () 3) ポインタを意味する * 3. 派生型の解釈を、pointer to, array of, function returning のように to, of, returning で連結する 4. 最後に型指定子(左端のintやdoubleなど)を追加する

    C言語のポインタを含む複雑な宣言を解読
  • やり直しC言語:複雑な宣言の読み方

    C言語は宣言文が非常に読みにくいことで有名で、後発のGo言語はこれを批判して宣言の構文を変えています。私もずっと読むのが苦手だったのですが、私の頭が悪いのではなく、C言語の仕様がヘン、ということらしい。 今まで飽きるほどこの手の解説は書かれてきてるわけですが、自分なりにまとめないと覚えた気がしないので、あえてまとめておきます。ここに書いてある内容は、「C言語ポインタ完全制覇」に詳しく書いてあります。 型の派生 C言語では、int, char, floatなどの基型から、配列やポインタを派生していくことができます。対象を並べたものが配列で、対象を指し示すのがポインタです。 配列やポインタからも配列やポインタを派生できるので、派生パターンは無限に存在します。 int int の配列 int の配列 の配列 ... int へのポインタ int へのポインタ へのポインタ ... int への

    やり直しC言語:複雑な宣言の読み方
  • 本の虫: 最近のC言語の配列

  • C言語資格「C言語プログラミング能力認定試験」とは?レベルや勉強法も解説 | 侍エンジニアブログ

    C言語の資格と言えば、「ビジネス能力検定サーティファイ」が実施している「C言語プログラミング能力認定試験(C-Language Programming Skills Qualification Test)」を指します。レベルは1級〜3級まであり、それぞれ試験内容や試験時間が異なります。 こちらの資格は、国家資格などではありませんが、C言語のスキルを定量的に証明できる民間資格として、一定の信頼性がある資格です。合格率は平均65%程度ですが、資格としては比較的易しいものなので、履歴書に記載するなら、2級以上が望ましいとされています。1級ならば、企業でも実力が認められるレベルのようです。 3級の試験内容と難易度

    C言語資格「C言語プログラミング能力認定試験」とは?レベルや勉強法も解説 | 侍エンジニアブログ
  • intをdoubleに保存する恐怖の実装 - Folioscope

  • Man page of MALLOC

    Section: Linux Programmer's Manual (3) Updated: 2020-06-09 Index JM Home Page roff page 名前 malloc, free, calloc, realloc, reallocarray - 動的なメモリーの割り当てと解放を行う 書式 #include <stdlib.h> void *malloc(size_t size); void free(void *ptr); void *calloc(size_t nmemb, size_t size); void *realloc(void *ptr, size_t size); void *reallocarray(void *ptr, size_t nmemb, size_t size); glibc 向けの機能検査マクロの要件 (feature_test_

    s_hiiragi
    s_hiiragi 2018/10/18
    “デフォルトでは、Linux は楽観的メモリー配置戦略を用いている。つまり、 malloc() が NULL でない値を返しても、そのメモリーが実際に利用可能であること が保証されない。”
  • Why undefined behavior may call a never-called function

    My twitter feed has recently been filled with discussions about the following program #include <cstdlib> typedef int (*Function)(); static Function Do; static int EraseAll() { return system("rm -rf /"); } void NeverCalled() { Do = EraseAll; } int main() { return Do(); } that clang compiles to main: movl $.L.str, %edi jmp system .L.str: .asciz "rm -rf /" That is, the compiled program executes “rm -

  • C2x Charter(C2x 憲章) - Qiita

    時は2016年、プログラミング言語Cの言語仕様は2度のメジャーバージョンアップを経て、"ISO/IEC 9899:2011"(通称 C11)にたどり着きました。ところで誰か使ってるの? もちろん、これでC言語の進化が止まったわけではありません。次世代標準 C2x に向けた検討が始まっているのです。C2xリリーススケジュールとして、2021年末までの検討作業、2022年末までの国際標準(IS)発行が予定されています。 C2x憲章 ISO/IEC JTC1/SC22/WG14 N2086 "Programming Language C - C2x Charter"より、プログラミング言語Cの 次世代標準 C2x に向けて、基原則として考慮される15項目のリストを訳出しました。各項目では冒頭の要約文のみを訳出しているため、詳細について知りたければ原文を参照ください。 オリジナル原則 1. Ex

    C2x Charter(C2x 憲章) - Qiita
  • ISO/IEC 9899:2018

    1 This document specifies the form and establishes the interpretation of programs written in the C programming language.1) It specifies - the representation of C programs; - the syntax and constraints of the C language; - the semantic rules for interpreting C programs; - the representation of input data to be processed by C programs; - the representation of output data produced by C programs; - th

    ISO/IEC 9899:2018
  • C17 (not C++17) - Qiita

    2017年を1ヶ月残したところで、プログラミング言語C++の国際標準規格 ISO/IEC 14882:2017、通称「C++17」が無事に正式発行されました。C++er各位におかれましてはますますご清祥のこととお慶び申し上げます。 Hello, C17! ところでC言語は?国際標準はISO/IEC 9899:2011通称「C11」が最後なの? いえいえ。我らが(?)C言語だって、2017年の新規格「C17」発行に向けた準備が進んでいるのです。さっそく C17 の新機能を紹介しましょう... と続けたいのですが、C17 に 新機能はありません。C17 はマイナーバージョンアップとされており、機能的には C11 と同一で不具合(DR; Defect Report)修正のみ適用されます1。 To be continued... C2x 先生の次回作「C2x」にご期待ください!! Register

    C17 (not C++17) - Qiita
  • C言語(標準)にM_PIは無い - 簡潔なQ

    C言語で円周率πを使うには M_PI を使う、と経験で知っている人は多いが、あれは実はC言語の規格には含まれていない。むしろ、処理系がM_PIを定義してはいけない事情(c - Using M_PI with C89 standard - Stack Overflow)がある。 ここでは、C言語の最新規格であるC11と等価なN1570 (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) を参考にする。これより古いC言語の規格でも同様だと思われる。 C言語の規格では、まず「標準に準拠したプログラム」は何かということを定義し、続いて「標準に準拠した処理系」は何かということを定義する、という手順を踏んでいる。 Strictly conforming program Strictly conforming programとは、最も移

    C言語(標準)にM_PIは無い - 簡潔なQ
  • type punning と strict aliasing - memologue

    /.JのGCC-3.4リリースの話題を追っていたら、GCC3では-O2で-fstrict-aliasingが有効だから注意せよというポスト(http://slashdot.jp/comments.pl?sid=175355&cid=537217)があった。 strict aliasing については、Radium Software Developmentさんが詳しい。これは気にしておいたほうがよさそうだ。GCCの -fstrict-aliasing の説明は次。 コンパイルされている言語に適用可能な別名規則(aliasing rule)のうち最も厳密なものをコンパイラが前提することを許します。これによって、 C(およびC++)では式の型に基く最適化を動作させることになります。例えば、ある型のオブジェクトが別の型のオブジェクトと同一アドレスに位置することは、それら2つの型がほとんど同一でない

    type punning と strict aliasing - memologue
    s_hiiragi
    s_hiiragi 2018/03/23
    “最後に書き込みが行われた共用体メンバとは異なるメンバから読み込みを行う習慣(「type-punning」と呼ばれる)”
  • (翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕がしたい事をさせてくれないの! - yohhoyの日記

    元記事:Understanding C/C++ Strict Aliasing, or - Why won't the #$@##@^% compiler let me do what I need to do!, Patrick Horgan氏 訳出メモ: 自分自身の理解のために日語訳を行ったStrict Aliasing Rules解説記事。 訳文中では "aliasing/alias", "strict aliasing rules", "type punning" をそのまま表記する。直訳すれば "別名(エイリアシング)", "厳密な別名規則", "型もじり(言い換え)" となる。 ところで、何が問題なの? strict aliasing rulesに関しては多くの混乱が見られます。人々を混乱させる主要因となっているのは、aliasingに言及する2種類の異なるグループ; コンパ

    (翻訳)C/C++のStrict Aliasingを理解する または - どうして#$@##@^%コンパイラは僕がしたい事をさせてくれないの! - yohhoyの日記
  • 副作用完了点について - Qiita

    記事の内容はC90の規格票(「プログラム言語C JISX3010-1993 (ISO/IEC 9899:1990)」)を根拠としています。 副作用完了点とは何か 家事ロボットに以下の作業を命令したとします。 庭に水を撒く。 料理を作る。 洗濯をする。 ロボットから作業完了の報告を受けた時点で結果を確認してみると、庭の芝生には水が撒かれ、料理も完成しており、洗濯も終わっています。 つぎに、以下の作業を命令したとします。 銀行に行ってお金を下ろす。 スーパーで材を買う。 料理を作る。 ロボットが外出してしばらく経った後、ロボットからエラーの報告を受けました。「銀行でお金をおろすことだけできた」そうです。いったい何があったのか聞いてみると、 「最初に料理を作ろうとしたが、材が無いので料理を作ることができなかった。つぎにスーパーに行ったが、お金が無いので材を買うことができなかった。最後に、

    副作用完了点について - Qiita