タグ付けされた質問 「c」

Cは、システムプログラミング(OSおよび組み込み)、ライブラリ、ゲーム、クロスプラットフォームに使用される汎用プログラミング言語です。このタグは、ISO 9899標準で定義されているC言語に関する一般的な質問で使用する必要があります(特に指定のない限り、最新バージョン9899:2018。バージョン固有のリクエストには、c89、c99、c11などのタグも付けます)。CはC ++とは異なり、合理的な理由がない限り、C ++タグと組み合わせるべきではありません。

13
malloc()とfree()はどのように機能しますか?
どうやっmallocてfree仕事をしたいのか知りたい。 int main() { unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char)); memset(p,0,4); strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes** cout << p; free(p); // Obvious Crash, but I need how it works and why crash. cout << p; return 0; } 可能であれば、答えがメモリレベルで詳細にある場合、私は本当に感謝します。


18
Cの「登録」キーワード?
何をしないregisterキーワードは、C言語でいますか?私はそれが最適化に使用されるが、どの標準でも明確に定義されていないことを読みました。それはまだ関連していますか?そうであれば、いつ使用しますか?
273 c  memory  keyword 

4
共有オブジェクト(.so)、静的ライブラリ(.a)、DLL(.so)の違いは?
Linuxのライブラリに関していくつかの議論に参加しており、いくつかのことを確認したいと思います。 アプリケーションを構築するときにライブラリを使用する方法は2つあるというのは私の理解です(間違っている場合は修正してください。後で投稿を編集します)。 静的ライブラリー(.aファイル):リンク時に、ライブラリー全体のコピーが最終アプリケーションに入れられるため、ライブラリー内の関数は常に呼び出し側アプリケーションで使用できます。 共有オブジェクト(.soファイル):リンク時に、オブジェクトは対応するヘッダー(.h)ファイルを介してAPIに対して検証されるだけです。ライブラリは、実行時まで実際には使用されません。 静的ライブラリの明らかな利点は、アプリケーション全体を自己完結できることです。動的ライブラリの利点は、「。so」ファイルを置き換えることができることです(つまり、セキュリティのために更新する必要がある場合)バグ)ベースアプリケーションを再コンパイルする必要はありません。 どちらも「.so」ファイルですが、共有オブジェクトとダイナミックリンクライブラリ(DLL)を区別する人がいると聞いています。Linuxまたは他のPOSIX準拠OS(つまり、MINIX、UNIX、QNXなど)でのC / C ++開発に関して、共有オブジェクトとDLLの間に違いはありますか?(これまでのところ)1つの重要な違いは、共有オブジェクトは実行時に使用されるだけであり、アプリケーション内でdlopen()呼び出しを使用してDLLを最初に開く必要があるということです。 最後に、一部の開発者が「共有アーカイブ」について言及しているのを聞いたことがあります。これは、私の理解では静的ライブラリでもありますが、アプリケーションで直接使用されることはありません。代わりに、他の静的ライブラリが「共有アーカイブ」にリンクして、共有アーカイブから構築中の静的ライブラリに一部(すべてではない)の関数/リソースをプルします。 よろしくお願いします。 更新 これらの用語が私に提供された状況では、Linuxを学習する必要があるWindows開発者のチームが使用した事実上誤った用語でした。私はそれらを修正しようとしましたが、(正しくない)言語の規範が行き詰まりました。 共有オブジェクト:プログラムの起動時にプログラムに自動的にリンクされ、スタンドアロンファイルとして存在するライブラリ。ライブラリはコンパイル時にリンクリストに含まれます(つまりLDOPTS+=-lmylib、という名前のライブラリファイルの場合mylib.so)。ライブラリは、コンパイル時とアプリケーションの起動時に存在している必要があります。 静的ライブラリ:アプリケーションコードと、プログラムのビルド時にプログラムに自動的にリンクされるライブラリコード、および両方を含む最終バイナリを含む単一(大きい)アプリケーションのビルド時に実際のプログラム自体にマージされるライブラリメインプログラムとライブラリ自体は、単一のスタンドアロンバイナリファイルとして存在します。ライブラリは、コンパイル時にリンクリストに含まれます(つまりLDOPTS+=-lmylib、mylib.aという名前のライブラリファイルの場合)。ライブラリはコンパイル時に存在している必要があります。 DLL:基本的に共有オブジェクトと同じですが、ライブラリはコンパイル時にリンクリストに含まれるのではなく、dlopen()/ dlsym()コマンドを介してロードされるため、プログラムをコンパイルするためにライブラリがビルド時に存在する必要はありません。また、ライブラリは、dlopen/ dlsym呼び出しが行われたときにのみ必要になるため、アプリケーションの起動時またはコンパイル時に(必ずしも)存在する必要はありません。 共有アーカイブ:基本的に静的ライブラリと同じですが、「export-shared」フラグと「-fPIC」フラグを使用してコンパイルされます。ライブラリはコンパイル時にリンクリストに含まれます(つまりLDOPTS+=-lmylibS、という名前のライブラリファイルの場合mylibS.a)。2つの違いは、共有オブジェクトまたはDLLが共有アーカイブを独自のコードに静的にリンクし、共有オブジェクトの関数を他のプログラムで使用するだけでなく、他のプログラムで使用できるようにする場合に、この追加のフラグが必要になることです。 DLLの内部。これは、誰かが静的ライブラリを提供し、それをSOとして再パッケージ化したい場合に役立ちます。ライブラリはコンパイル時に存在している必要があります。 追加アップデート 「DLL」と「shared library」の違いは、私が当時働いていた会社での(怠惰で不正確な)口語表現(Windows開発者はLinux開発に移行せざるを得ず、用語は行き詰まっている)であり、上記の説明に忠実でした。 さらに、S「共有アーカイブ」の場合、ライブラリ名の後に続く「」リテラルは、その会社で使用されている規則であり、業界では一般的ではありませんでした。
273 c++  c  linux  dll  linker 

13
Cで列挙型(列挙型)を定義する方法は?
Cの列挙型を使用するための適切な構文が何かはわかりません。私は次のコードを持っています: enum {RANDOM, IMMEDIATE, SEARCH} strategy; strategy = IMMEDIATE; しかし、これはコンパイルされず、次のエラーが発生します。 error: conflicting types for ‘strategy’ error: previous declaration of ‘strategy’ was here 何が悪いのですか?
272 c  enums 



23
プログラムが実行されているディレクトリを取得するにはどうすればよいですか?
C / C ++を使用してプログラムが実行されているディレクトリのフルパスを取得するための、プラットフォームに依存しない方法とファイルシステムに依存しない方法はありますか?現在の作業ディレクトリと混同しないでください。(clibやSTLのような標準的なライブラリでない限り、ライブラリを推奨しないでください。) (プラットフォーム/ファイルシステムに依存しない方法がない場合、特定のファイルシステムについてWindowsおよびLinuxで機能する提案も歓迎します。)
269 c++  c  working-directory 

30
「if」チェーンを回避する方法は?
私がこの疑似コードを持っていると仮定します: bool conditionA = executeStepA(); if (conditionA){ bool conditionB = executeStepB(); if (conditionB){ bool conditionC = executeStepC(); if (conditionC){ ... } } } executeThisFunctionInAnyCase(); 前の関数executeStepXが成功した場合にのみ、関数を実行する必要があります。いずれの場合も、executeThisFunctionInAnyCase関数は最後に呼び出す必要があります。私はプログラミングの初心者なので、非常に基本的な質問で申し訳ありません。ifコードの読みやすさを犠牲にして、そのような「コードのピラミッド」を生成する長いチェーンを回避する方法はありますか(C / C ++など)? executeThisFunctionInAnyCase関数呼び出しをスキップできれば、コードは次のように簡略化できます。 bool conditionA = executeStepA(); if (!conditionA) return; bool conditionB = executeStepB(); if (!conditionB) return; bool conditionC = executeStepC(); if (!conditionC) return; …

8
実際にファイルを開くとどうなりますか?
(少なくとも私が使用している)すべてのプログラミング言語では、ファイルを読み書きする前にファイルを開く必要があります。 しかし、このオープン操作は実際には何をするのでしょうか? 典型的な関数のマニュアルページは実際にはそれが「読み取り/書き込みのためにファイルを開く」こと以外は何も教えていません: http://www.cplusplus.com/reference/cstdio/fopen/ https://docs.python.org/3/library/functions.html#open 明らかに、関数の使用を通じて、ファイルへのアクセスを容易にする何らかの種類のオブジェクトの作成が含まれていることがわかります。 別の言い方をすると、もし私がopen関数を実装したとしたら、それはLinuxで何をする必要があるでしょうか?
266 c  linux 


3
Cに矢印(->)演算子が存在するのはなぜですか?
ドット(.)演算子は、構造体のメンバーにアクセスするために使用され->、Cの矢印演算子()は、問題のポインターによって参照される構造体のメンバーにアクセスするために使用されます。 ポインター自体には、ドット演算子を使用してアクセスできるメンバーはありません(実際には、仮想メモリ内の場所を表す数値にすぎないため、メンバーはありません)。したがって、ポインターで使用される場合にポインターを自動的に逆参照するようにドット演算子を定義した場合でも、あいまいさはありません(コンパイラーがコンパイル時に知っている情報)。 では、言語の作成者が、この一見不要に見える演算子を追加することで、物事をより複雑にすることに決めたのはなぜですか?大きな設計上の決定は何ですか?
264 c  pointers  dereference 

14
Cで文字列の配列を作成するにはどうすればよいですか?
Cで文字列の配列を作成しようとしています。このコードを使用する場合: char (*a[2])[14]; a[0]="blah"; a[1]="hmm"; gccは私に「警告:互換性のないポインタ型からの割り当て」を与えます。これを行う正しい方法は何ですか? 編集:私がこれを行うとprintf(a[1]);、「hmm」が正しく出力されるので、なぜこれがコンパイラ警告を出すのか興味があります。
263 c  arrays  string 

10
C / C ++での整数除算の高速上限
与えられた整数値xとy、CとC ++は両方ともq = x/y、等価の浮動小数点の床を商として返します。代わりに天井を返す方法に興味があります。たとえば、ceil(10/5)=2およびceil(11/5)=3。 明らかなアプローチには、次のようなものが含まれます。 q = x / y; if (q * y < x) ++q; これには、追加の比較と乗算が必要です。そして私が見た(実際に使用された)他の方法は、floatまたはとしてキャストすることを含みdoubleます。追加の乗算(または2番目の除算)と分岐を回避し、浮動小数点数としてのキャストを回避するより直接的な方法はありますか?
262 c++  c  algorithm  math 


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.