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

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


24
Cに役立つGCCフラグ
設定を越えて-Wall、設定-std=XXX、その他の本当に便利な、あまり知られているコンパイラフラグは、Cでの使用のために何がありますか? 偶発的なタイプの不一致を完全に最小限に抑えるために、追加の警告や、場合によっては警告をエラーに変換することに特に興味があります。
157 c  gcc  compiler-flags 

8
Cランタイムライブラリとは何ですか?
実際にはCランタイムライブラリとは何ですか?私は悪魔のようにグーグルで検索していましたが、Microsoftよりも優れたものはありませんでした。「Microsoftランタイムライブラリは、Microsoft Windowsオペレーティングシステム用のプログラミングルーチンを提供します。これらのルーチンは、 CおよびC ++言語。」 わかりました。でも、たとえば、何が入っているのlibcmt.libですか?それは何をするためのものか?C標準ライブラリはCコンパイラの一部だと思いました。それでは、libcmt.libWindowsのC標準ライブラリ関数の実装は、win32で動作しますか?
157 c  runtime 

22
Cでのオブジェクト指向
Cである種の醜い(しかし使用可能な)オブジェクト指向を可能にする気の利いたプリプロセッサハック(ANSI C89 / ISO C90互換)のセットは何ですか? 私はいくつかの異なるオブジェクト指向言語に精通しているので、「C ++を学ぶ!」のような答えを返さないでください。私は「ANSI Cによるオブジェクト指向プログラミング」(注意:PDF形式)と他のいくつかの興味深い解決策を読みましたが、主にあなたの解決策に興味があります:-)! Cでオブジェクト指向コードを記述できますか?も参照してください。
157 c  oop  object 

11
memcpy()対memmove()
私は違いを理解しようとしているmemcpy()としmemmove()、そして私は、テキスト読み持っているmemcpy()のに対し、重複送信元と送信先の世話をしていないmemmove()んです。 ただし、これらの2つの関数を重複するメモリブロックで実行すると、どちらも同じ結果になります。たとえば、memmove()ヘルプページで次のMSDNの例を見てください。 の欠点を理解し、それmemcpyをどのようにmemmove解決するためのより良い例がありますか? // crt_memcpy.c // Illustrate overlapping copy: memmove always handles it correctly; memcpy may handle // it correctly. #include <memory.h> #include <string.h> #include <stdio.h> char str1[7] = "aabbcc"; int main( void ) { printf( "The string: %s\n", str1 ); memcpy( str1 + 2, str1, 4 ); printf( "New …
157 c  memcpy  memmove 

10
ポインタを渡すのではなく、Cで構造体を値で渡すことの欠点はありますか?
ポインタを渡すのではなく、Cで構造体を値で渡すことの欠点はありますか? 構造体が大きい場合、明らかに大量のデータをコピーするパフォーマンスの側面がありますが、構造体が小さい場合、基本的には、いくつかの値を関数に渡すことと同じです。 戻り値として使用すると、さらに興味深いかもしれません。Cには関数からの戻り値が1つしかありませんが、多くの場合、いくつか必要です。簡単な解決策は、それらを構造体に入れて返すことです。 これには賛成または反対の理由がありますか? ここで私が話していることは誰にとっても明白ではないかもしれないので、簡単な例を挙げます。 Cでプログラミングしている場合は、遅かれ早かれ次のような関数の記述を開始します。 void examine_data(const char *ptr, size_t len) { ... } char *p = ...; size_t l = ...; examine_data(p, l); これは問題ではありません。唯一の問題は、すべての関数で同じ規則を使用するために、パラメーターの順序を同僚に同意する必要があることです。 しかし、同じ種類の情報を返したい場合はどうなりますか?通常は次のようになります。 char *get_data(size_t *len); { ... *len = ...datalen...; return ...data...; } size_t len; char *p = get_data(&len); これは正常に機能しますが、はるかに問題があります。戻り値は戻り値ですが、この実装ではそうではありません。上記から、関数get_dataがlenが指すものを見ることが許可されていないことを知る方法はありません。そして、値がそのポインタを通じて実際に返されることをコンパイラにチェックさせるものは何もありません。だから来月、誰かがコードを正しく理解せずにコードを変更すると(彼はドキュメントを読んでいないため)、だれにも気付かれずにコードが壊れるか、ランダムにクラッシュし始めます。 だから、私が提案する解決策は単純な構造です struct blob { char …

9
z / OS上のC ++でCソケットAPIを使用する方法
私はで正しく動作させるにはCのソケットAPIを取得して問題抱えているC++のをz/OS。 含めていますがsys/socket.h、まだ定義されていないことを示すコンパイル時エラーが発生します。AF_INET 私は明らかなものを欠いていますか、またはこれがオンにz/OSなっていると問題がはるかに複雑になるという事実に関連していますか? 更新:さらに調査したところ、#ifdef私がぶつけているものがあることがわかりました。z/OS私が使用しているソケットの「タイプ」を定義しない限り、どうやら満足しません: #define _OE_SOCKETS 今、私_OE_SOCKETSはこれが実際に何のためにあるのかz/OS私にはわかりません。そのため、ソケットプログラマがいる場合(3人全員)、おそらくこれがどのように機能するのかを簡単に説明できますか? テストアプリ #include <sys/socket.h> int main() { return AF_INET; } コンパイル/リンク出力: cxx -Wc,xplink -Wl,xplink -o inet_test inet.C "./inet.C", line 5.16: CCN5274 (S) The name lookup for "AF_INET" did not find a declaration. CCN0797(I) Compilation failed for file ./inet.C. Object file not created. sys / …
157 c++  c  sockets  mainframe  zos 

9
memsetでbzeroを使用する理由
私はこの前学期に受けたシステムプログラミングクラスで、基本的なクライアント/サーバーをCで実装する必要がありました。などの構造体sock_addr_inや文字バッファー(クライアントとサーバー間でデータを送受信するために使用)を初期化するときにそれらを使用するだけで初期化しbzeroないように指示しmemsetました。彼はなぜその理由を説明したことがなく、これに正当な理由があるかどうか私は知りたいですか? 私はここを参照してください:http : //fdiv.net/2009/01/14/memset-vs-bzero-ultimate-showdownこれbzeroはメモリをゼロにするだけなので、より効率的であるため、実行されるmemset可能性がある追加のチェックを実行する必要があります。それでも、memsetメモリのゼロ化に絶対に使用しない理由とは限りません。 bzeroは非推奨と見なされ、さらに標準のC関数ではありません。マニュアルによると、この理由のためにmemset推奨されbzeroます。では、なぜそれbzero以上に使いたいのでしょうmemsetか?効率を上げるためだけですか、それともそれ以上ですか?同様に、それが新しいプログラムにとって事実上好ましいオプションになっmemsetてbzeroいることの利点は何ですか?

23
解放後に変数をNULLに設定
私の会社では、メモリを解放した後、変数をにリセットするというコーディングルールがありますNULL。例えば ​​... void some_func () { int *nPtr; nPtr = malloc (100); free (nPtr); nPtr = NULL; return; } 上記のコードのような場合、に設定しNULLても意味がないと思います。それとも何か不足していますか? そのような場合に意味がない場合は、このコーディングルールを削除するために「品質チーム」に取り上げます。アドバイスをお願いします。


5
ビットシフトはエンディアンに依存しますか?
私が'numb'=1025 [00000000 00000000 00000100 00000001]表されている数を持っていると仮定します: リトルエンディアンマシンの場合: 00000001 00000100 00000000 00000000 ビッグエンディアンマシンの場合: 00000000 00000000 00000100 00000001 ここで、左シフトを10ビットに適用すると(つまり、numb << = 10)、次のようになります。 [A]リトルエンディアンマシンの場合: GDBで気付いたように、リトルエンディアンは左シフトを3ステップで実行します。[処理のみを理解するために「3」ステップを示しました] いいえを扱います。ビッグエンディアン条約: 00000000 00000000 00000100 00000001 左シフトを適用: 00000000 00010000 00000100 00000000 結果をリトルエンディアンで再度表します。 00000000 00000100 00010000 00000000 [B]。ビッグエンディアンマシンの場合: 00000000 00010000 00000100 00000000 私の質問は: リトルエンディアンコンベンションに直接左シフトを適用すると、次のようになります。 numb: 00000001 00000100 00000000 00000000 numb << …
156 c  endianness 

9
私の変数はメモリのどこにCに保存されますか?
メモリがデータ、ヒープ、スタック、コードの4つのセグメントに分割されていることを考慮して、グローバル変数、静的変数、定数データ型、ローカル変数(関数で定義および宣言)、変数(メイン関数内)、ポインター、および動的に割り当てられたスペース(mallocおよびcallocを使用)はメモリに格納されますか? 次のように割り当てられると思います。 グローバル変数------->データ 静的変数------->データ 定数データ型----->コード ローカル変数(関数で宣言および定義)--------> stack メイン関数で宣言および定義された変数----->ヒープ ポインタ(例えばchar *arr、int *arr)------->ヒープ 動的に割り当てられたスペース(mallocおよびcallocを使用)-------->スタック これらの変数は、Cの観点からのみ参照しています。 私はCを初めて使用するので、間違っている場合は修正してください。

5
組み込み関数「malloc」の互換性のない暗黙の宣言
私はこのエラーを受け取ります: 警告:組み込み関数「malloc」の互換性のない暗黙の宣言 私はこれをやろうとしています: fileinfo_list* tempList = malloc(sizeof(fileinfo_list)); 参考までに、手元で使用されている構造体は次のとおりです。 typedef struct { fileinfo** filedata; size_t nFiles; size_t size; size_t fileblock; } fileinfo_list; 私がやったことには何の問題もありません。tempList1 xのサイズのを作成していますfileinfo_list。
155 c  struct  malloc 

21
Cで文字列を区切り文字で分割する
Cプログラミング言語で区切り文字を含む文字列の配列を分割して返す関数を作成するにはどうすればよいですか? char* str = "JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC"; str_split(str,',');
155 c  string  split 

7
「float」と「double」の精度
コード float x = 3.141592653589793238; double z = 3.141592653589793238; printf("x=%f\n", x); printf("z=%f\n", z); printf("x=%20.18f\n", x); printf("z=%20.18f\n", z); あなたに出力を与えます x=3.141593 z=3.141593 x=3.141592741012573242 z=3.141592653589793116 出力の3行目741012573242はガベージで、4行目116はガベージです。倍精度浮動小数点数は常に16の有効数字を持っていますが、浮動小数点数は常に7の有効数字を持っていますか?ダブルスに14の有効数字がないのはなぜですか?
155 c  floating-point 

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