タグ

関連タグで絞り込む (162)

タグの絞り込みを解除

Cに関するiwwのブックマーク (406)

  • POS03-C. volatile を同期用プリミティブとして使用しない

    POS03-C. volatile を同期用プリミティブとして使用しない volatile 修飾子がマルチスレッドプログラムに必要とされる以下の特性を備えている、というのは誤解である。 アトミック性: 分割不可能な 1 単位の処理としてメモリ操作を実行できる 可視性: あるスレッドで実行した書き込み操作の結果が別のスレッドから見える 逐次性: あるスレッドによる一連のメモリ操作は、他のスレッドでも同じ順番で見えることが保証される 残念ながら、これらのどの特性についても、volatile 修飾子によって実現されるという保証はまったくない。こうした特性は仕様に定義されておらず、各種プラットフォーム上でこうした特性を備えた実装方法が採用されているわけでもない。volatile の実装の詳細については、「DCL17-C. volatile 修飾された変数が間違ってコンパイルされることに注意」を参照

    POS03-C. volatile を同期用プリミティブとして使用しない
  • サイズが0の構造体は作れない? - Qiita

    前書き この記事は、2023Unityアドカレの12/23の記事です。 今年は、完走賞に挑戦してみたいと思います。Qiita君ぬい欲しい! はじめに C#は「マネージド」というだけあって、普段はメモリ上でのふるまいなどはあまり意識しなくて済むようになっています。しかし、もう一つの顔があり、unsafeコンテキストや、Marshal、Unsafeクラスなど、ローレベルまでプログラマが制御できる仕組みも備わっております。 StructLayoutで構造体サイズを指定 構造体がメモリ上でどのようなレイアウトをとるかについては、普段は意識せずともコンパイラやランタイム(JIT)が良しなにしてくれます。しかし、[StructLayout]属性を使うことでこれを指定することもできます。 例えばこのようにすると、フィールドはbyteが1つだけ、賞味1byteしかないですが、512byteとしてあつかう

    サイズが0の構造体は作れない? - Qiita
    iww
    iww 2024/10/07
    フレキシブル構造体
  • DCL38-C. フレキシブル配列メンバには正しい構文を使用する

    DCL38-C. フレキシブル配列メンバには正しい構文を使用する フレキシブル配列メンバ(flexible array member)とは、2 つ以上の名前付きメンバをもつ構造体の最後のメンバが不完全配列型、つまり、構造体の中で配列のサイズが明確に指定されていない、特殊な型になっている配列を指す。struct hack と呼ばれるこの手法は広く使われており、さまざまなコンパイラが対応している。それゆえ、フレキシブル配列メンバの宣言にはさまざまな構文が使用されてきた。C 標準に適合した実装では、C 標準によって有効であると保証されている構文を使用すること。 フレキシブル配列メンバは、C 標準のセクション 6.7.2.1 パラグラフ 18 において次のように定義されている[ISO/IEC 9899:2011]。 特別な場合として、2 つ以上の名前付きメンバをもつ構造体の最後のメンバは、不完全配

    DCL38-C. フレキシブル配列メンバには正しい構文を使用する
    iww
    iww 2024/10/07
    フレキシブル構造体
  • zero length array, flexible array - Shohei Yoshida's Diary

    github.com たまたま目に入ったこのコードを見ていて, zero length arrayって末尾のメンバ以外でも使えたんだって思って気になるところを調べてみた. Flexible array en.wikipedia.org C99から入った機能. 配列の長さを宣言しないことで利用できる. sizeofはできない. 構造体などの末尾フィールドに置くことができる. 典型的な使い方は以下のような感じ. struct Data { // some fields SomeData s[]; }; struct Data *d = malloc(sizeof(Data) + some_arbitrary_size); ポインタを使ってしまうと構造体とこの末尾のデータがある場所は別の領域になってしまうわけだが, このようにすることで連続するメモリにすべて割り当てることができる. 構造体の末尾

    zero length array, flexible array - Shohei Yoshida's Diary
    iww
    iww 2024/10/07
    フレキシブル構造体
  • JISX3010:2003 プログラム言語C

    X 3010:2003 (ISO/IEC 9899:1999) (1) 2019年7月1日の法改正により名称が変わりました。まえがきを除き,規格中の「日工業規格」を「日産業規格」に読み替えてください。 まえがき この規格は,工業標準化法第14条によって準用する第12条第1項の規定に基づき,社団法人情報処理 学会情報規格調査会(IPSJ)/財団法人日規格協会(JSA)から,工業標準原案を具して日工業規格を改正 すべきとの申出があり,日工業標準調査会の審議を経て,経済産業大臣が改正した日工業規格である。 これによって,JIS X 3010:1996は改正され,この規格に置き換えられる。 改正に当たっては,日工業規格と国際規格との対比,国際規格に一致した日工業規格の作成及び日 工業規格を基礎にした国際規格原案の提案を容易にするために,ISO/IEC 9899:1999,Pro

    JISX3010:2003 プログラム言語C
    iww
    iww 2024/08/12
    『国際規格に一致した日本工業規格の作成及び日本工業規格を基礎にした国際規格原案の提案を容易にするために,ISO/IEC 9899:1999,Programming languages―C及びISO/IEC 9899 Technical Corrigendum 1:2001を基礎として用いた。』
  • C言語の公式仕様について

    思ったほど簡単に見つからなかったんで、 後々のネタのため、リンク等載せておきます。 【英語版】 ISO/IEC 9899:201x のC言語仕様 Programming languages – C; Open Standards http://www.open-std.org/jtc1/sc22/wg14/www/projects#9899 【日語版】 JIS X3010 のC言語仕様 プログラム言語 C; 日工業標準調査会 http://www.jisc.go.jp/の「JIS検索」で「X3010」を検索。

    C言語の公式仕様について
  • UTF-8の文字列の文字数を数える - Qiita

    UTF-8をコードポイントに分解する まずはじめに、コマンドライン引数で入力された文字列を、コードポイントごとに表示するプログラムを作成します。 UTF-8からコードポイントを求める方法は、Wikipedia で説明されているとおりです。 注意: 以下の説明は、Windowsでは動作しません。Linux, FreeBSD, MacOSX (またはCygwin)で試してください。 #include <stdio.h> /** * next_codepoint(&ptr); * ptrを、次のコードポイントの位置に動かす */ static int next_codepoint(const char **pp) { const char *p = *pp; int c = -1; if (*p == 0) { } else if ((*p & 0x80) == 0) { c = *p++ &

    UTF-8の文字列の文字数を数える - Qiita
  • 【C言語】日本語文字列の字数カウント・文字列切り出し(マルチバイト文字) - Qiita

    はじめに C言語で日語文字列を扱う場合は、例えば、ワイド文字のライブラリを使用する方法があります(参考:C言語用語集 - ワイド文字 )。 しかし、ワイド文字は、1文字あたりのバイト数を固定して処理することが前提であるため、可変長の文字コード(UTF-8、SHIFT_JIS、EUC-JPなどのマルチバイト文字)を扱うには、別の方策が必要となります。 (以上、yumetodoさんのご指摘を受け一部修正をさせていただきました。) ここでは、マルチバイト文字における「日語文字数のカウント」及び「日語文字列の切り出し」について、サンプルコードとともにまとめておきます。 なお、日語文字数のカウント(UTF-8、SHIFT_JISのみ)については、1年前に自分のHPにも書いています。 今回は、当時の記述の補正もしつつ、各文字コードについて一覧的に記述をしています。 使用しているコンパイラはgc

    【C言語】日本語文字列の字数カウント・文字列切り出し(マルチバイト文字) - Qiita
  • man poll (2): ファイルディスクリプタにおけるイベントを待つ

  • pthread mutex lockとAtomic型修飾子の比較 - C言語入門

    mutex のロックは、コストが高い、ということでしたが、アトミックを使ったほうが、今回の単純なケースでは、速い、ということが解りました。 また、_Atomicを利用した場合のほうが、ソースコードも簡単になります。 pthread_mutex_lockを使うと pthread_mutex_unlock の呼び出しも必要になり、コードが汚くなってしまいます。 ヘッダファイル サンプルコードの意味 2つのスレッドを同時に実行します。 片方の1つのスレッドは、グローバル変数 shared_data をインクリメントし続けます。 もう1つのスレッドは、グローバル変数 shared_data をデクリメントし続けます。 最終的に 0 になることを期待します。 ロックなしのコードは、アトミックに処理できないので、結果は不定です(0かもしれないし、0以外かもしれない)。 pthread_test1_no

    iww
    iww 2024/06/02
    アトミック
  • man msync (2): ファイルをマップしたメモリと同期させる

    iww
    iww 2024/04/28
    『Linux 2.6.19 以降では MS_ASYNC は実際には no-op (何もしない命令) である』 マジで? 律儀に呼んでいたのに 無駄だったの?
  • ソフトウェアバグ -Segmentation Fault- - 株式会社Ninjastars 技術系ブログ

    株式会社Ninjastars取締役の齊藤です。 皆様もC言語やC++で開発しているときなどに一度はこの実行時エラーを見たことがあるのではないでしょうか? 今回はSegmentation Fault(以下セグフォ)がどのようにして発生するのかを詳細に書いていこうと思います。 1.セグフォとは 割り当てられた仮想メモリ領域(セグメント)に読み込み(r)または書き込み(w)、実行の権限(x)がない状態でアクセスしたときに起こるエラーのことを指します。 では、なぜセグフォが必要なのでしょうか? それはメモリに展開されているプロセスを保護し、OS全体に影響を及ぼさないためです。 2.セグフォの原因を探す手順 プログラムを用意したのでそれを例に原因を探していきましょう。 まず今回のプログラムは標準入力で10byteのbufferに文字データを格納するものです。 標準入力する際、gets関数を使っている

    ソフトウェアバグ -Segmentation Fault- - 株式会社Ninjastars 技術系ブログ
    iww
    iww 2024/03/25
    『本レポートに記載されている内容を許可されていないソフトウェアで行うと、場合によっては犯罪行為となる可能性があります。』 マジか。 どの法律だろ
  • AddressSanitizerを試す - cuspy diary

    C言語 Advent Calendar 2016 16日目です。 clang 3.1, gcc 4.9以降にメモリ関連の不正な操作を検出するAddressSanitizerという仕組みが入りました。 二重freeやバッファオーバーフローなどCプログラミングにありがちなメモリ操作を検出できるので、ソフトウェアの品質向上だけでなく、セキュリティ対策としても有用です。 以下に思いつく限りのメモリの不正操作を実際に試してみました。 (1) スタックオーバーフロー(1.1) 正方向の書き込み [stack_overwrite.c] (https://github.com/hamano/santest/blob/master/tests/stack_overwrite.c)(1.2) 正方向の参照 [stack_overread.c] (https://github.com/hamano/santes

    AddressSanitizerを試す - cuspy diary
  • C で関数に * や & を付けられる件の説明 - Qiita

    規格として C11 (n1570) を参照する。 注意: 途中に入れた図が崩れるようなら、半角・全角比が 1:2 になるようなフォントを使って閲覧してください。 現象 wandbox で実行 ソース: ( &printf)(" &printf = %p\n", &printf); printf (" printf = %p\n", printf); ( *printf)(" *printf = %p\n", *printf); ( **printf)(" **printf = %p\n", **printf); (***printf)("***printf = %p\n", ***printf); この現象を解説する。 関数呼び出し まず、関数呼び出しについての規定を見る。 The expression that denotes the called function shall have

    C で関数に * や & を付けられる件の説明 - Qiita
  • clang-formatの導入手順と使い方

    はじめに これは何か / 何がいいのか clang-formatは、主にC++を対象としたソースコード整形ツール(code formatter)である。 ソースコード整形ツールは、ソースコードのフォーマット: コーディングスタイルのうちの見た目に関するものを、一定のルールに従って整形するツールである。ソースコード整形ツールを使うことで、例えばインデントの行い方やカッコの付け方などを手間をかけずに統一できる。チームで開発する際などに、全ソースコードのフォーマットをツールに任せて統一できると、フォーマットに対する好みの差によるソースコードの差分が発生しないため開発効率がよい。 C++用ソースコード整形ツールとして、2022年9月現在で名前がよく知られているのはclang-formatぐらいの様子。 clang-formatでは、整形の行い方をルールファイルで指定する。用意されているスタイル(G

    clang-formatの導入手順と使い方
  • __FILE__ - ファイル名 - C言語ゼミ - C99以降のC言語にサンプル全対応

    iww
    iww 2024/02/29
    『コンパイル時に、どのような名前でCソースファイルを指定したかによります。』 マジか。知らなかった。 環境依存では無いのか
  • Visual Studio Codeでsigactionを使うと「incomplete type is not allowed」 - cist-it

  • 【C】可変長マクロで引数なしを受け渡すには ##__VA_ARGS__ (gcc拡張)

    C言語のマクロの引数の最後に ... を指定することで任意個の引数を取り、 __VA_ARGS__ で参照できる:

  • vsprintf(3) manページ

  • C/C++プログラム実行時の関数をトレースする方法

    C/C++プログラム実行時の関数をトレースする方法を紹介します。 1.はじめに C/C++プログラムで実行時の関数をトレースする場合、printf()などを埋め込んでログに出力することが少なくないと思います。 が、その方法ではログ出力するためにプログラムに手を入れなくてはならなず、非効率です。 また規模の大きなプログラムでは現実的な解決方法ではありません。 printf()を埋め込まずにトレースできないか、方法を探していたところ、標準でそのような機能があることをみつけました。 仕組みは、gccでトレースしたいプログラムファイルのコンパイル時に、コンパイルオプション"-finstrument-functions"を付与することで、関数の実行開始時および復帰時に下記のフック関数を呼び出せるようになります。 void __cyg_profile_func_enter(void* func, vo

    C/C++プログラム実行時の関数をトレースする方法