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

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

8
Cでの変数宣言の配置
Cでは、すべての変数を関数の先頭で宣言する必要があるとずっと思っていました。C99でのルールはC ++と同じであることは知っていますが、C89 / ANSI Cの変数宣言の配置ルールは何ですか? 次のコードはgcc -std=c89andで正常にコンパイルされますgcc -ansi。 #include <stdio.h> int main() { int i; for (i = 0; i < 10; i++) { char c = (i % 95) + 32; printf("%i: %c\n", i, c); char *s; s = "some string"; puts(s); } return 0; } の宣言cとsC89 / ANSIモードでのエラーの原因になるべきではありませんか?
129 c  declaration  c89 

6
ソケットライブラリでrecvを呼び出すときに、recvバッファーの大きさ
Cのソケットライブラリについていくつか質問があります。質問で参照するコードスニペットを次に示します。 char recv_buffer[3000]; recv(socket, recv_buffer, 3000, 0); recv_bufferをどのくらい大きくするかをどのように決定しますか?私は3000を使用していますが、それは任意です。 あれば何が起こるrecv()私のバッファよりも大きなパケットを受信しましたか? もう一度recvを呼び出さずにメッセージ全体を受信したかどうかを確認し、受信するものが何もないときに永久に待機させるにはどうすればよいですか? スペースが不足することを恐れずにバッファーを追加し続けることができるように、バッファーに一定のスペースがないようにする方法はありますか?たぶん、バッファへのstrcat最新のrecv()応答を連結するために使用していますか? たくさんの質問があることは承知していますが、ご回答をいただければ幸いです。
129 c  sockets  buffer  recv 

6
GCCを使用するx86で整数オーバーフローが無限ループを引き起こすのはなぜですか?
次のコードは、GCCの無限ループに入ります。 #include <iostream> using namespace std; int main(){ int i = 0x10000000; int c = 0; do{ c++; i += i; cout << i << endl; }while (i > 0); cout << c << endl; return 0; } だからここでの取り決めです:符号付き整数オーバーフローは技術的に未定義の動作です。しかし、x86上のGCCは、オーバーフローでラップするx86整数命令を使用して整数演算を実装します。 したがって、未定義の動作であるにもかかわらず、オーバーフローでラップすることを期待していました。しかし、明らかにそうではありません。それで私は何を逃したのですか? 私はこれを使ってこれをコンパイルしました: ~/Desktop$ g++ main.cpp -O2 GCC出力: ~/Desktop$ ./a.out 536870912 1073741824 …
129 c++  c  gcc  x86  undefined-behavior 

15
Cプログラミングにおけるvoidポインターの概念
Cプログラミング言語で型キャストせずにvoidポインターを逆参照することは可能ですか? また、ポインタを受け取り、それをvoidポインタに格納できる関数を一般化する方法はありますか?そのvoidポインタを使用して、一般化された関数を作成できますか? たとえば: void abc(void *a, int b) { if(b==1) printf("%d",*(int*)a); // If integer pointer is received else if(b==2) printf("%c",*(char*)a); // If character pointer is received else if(b==3) printf("%f",*(float*)a); // If float pointer is received } if-elseステートメントを使用せずにこの関数をジェネリックにしたいのですが、これは可能ですか? また、voidポインターの概念を説明する優れたインターネット記事がある場合は、URLを提供できれば有益です。 また、voidポインターを使用したポインター演算は可能ですか?
129 c  void-pointers 

11
scanfを使用してスペースを入力するにはどうすればよいですか?
次のコードを使用します。 char *name = malloc(sizeof(char) + 256); printf("What is your name? "); scanf("%s", name); printf("Hello %s. Nice to meet you.\n", name); ユーザーは、自分の名前を入力することができますが、彼らは次のようにスペースで名前を入力するとLucas Aardvark、scanf()直後にすべてを遮断しますLucas。scanf()スペースを許可する方法
129 c  string  printf  scanf  whitespace 

9
いつ、なぜコンパイラはmalloc / free / new / deleteでメモリを0xCD、0xDDなどに初期化しますか?
コンパイラが、0xCDやなどの特定のパターンでメモリを初期化する場合があることを知ってい0xDDます。私が知りたいのは、いつ、なぜこれが起こるのかということです。 いつ これは使用するコンパイラに固有ですか? やるmalloc/newとfree/deleteこれに関連して同じように動作しますか? プラットフォーム固有ですか? Linuxまたはなどの他のオペレーティングシステムで発生しVxWorksますか? なぜ 私の理解では、これはWin32デバッグ構成でのみ発生し、メモリオーバーランを検出し、コンパイラが例外をキャッチするのに役立ちます。 この初期化がどのように役立つかについて、実用的な例を挙げていただけますか? 割り当て時にメモリを既知のパターンに初期化することをお勧めします(コードコンプリート2で)何かを読んだことを覚えていWin32ます。特定のパターンは割り込みをトリガーし、デバッガーに例外が表示されます。 これはどれほどポータブルですか?

3
以下のプログラムは、C89モードでコンパイルしたときに「C89」を出力し、C99モードでコンパイルしたときに「C99」をどのように出力しますか?
私はこのCプログラムをウェブから見つけました: #include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } このプログラムの興味深い点は、C89モードでC89コンパイルおよび実行すると印刷され、C99モードでコンパイルおよび実行すると印刷されることC99です。しかし、私はこのプログラムがどのように機能するかを理解することができません。 printf上記のプログラムで2番目の引数がどのように機能するかを説明できますか?
128 c  printf  comments  c99  c89 

12
Pythonをマシンコードにコンパイルすることは可能ですか?
Pythonを(おそらくCの中間表現を介して)マシンコードにコンパイルすることは、どの程度実行可能でしょうか? おそらく、それはPythonランタイムライブラリにリンクする必要があり、Python標準ライブラリの一部であるPython自体もコンパイル(およびリンク)する必要があります。 また、式の動的評価を実行する場合は、Pythonインタープリターをバンドルする必要がありますが、これを許可しないPythonのサブセットは引き続き有用です。 速度やメモリ使用量に利点がありますか?おそらくPythonインタープリターの起動時間がなくなります(ただし、共有ライブラリは起動時にロードする必要があります)。
128 python  c  linker  compilation 

30
列挙型変数を文字列に変換する方法は?
enum型の変数の値を表示するようにprintfを作成するにはどうすればよいですか?例えば: typedef enum {Linux, Apple, Windows} OS_type; OS_type myOS = Linux; そして私が必要なのは printenum(OS_type, "My OS is %s", myOS); 整数ではなく文字列「Linux」を表示する必要があります。 まず、値のインデックスが付けられた文字列の配列を作成する必要があると思います。しかし、それが最も美しい方法かどうかはわかりません。まったく可能ですか?
128 c++  c  preprocessor  ansi-c 

10
ポインター式:* ptr ++、* ++ ptrおよび++ * ptr
最近、自分では理解できないこの問題に遭遇しました。 これらの3つの表現は本当に何ですか意味するのでしょうか? *ptr++ *++ptr ++*ptr リッチーを試しました。しかし、残念ながら、彼はこれらの3つの操作について彼が言ったことを追跡することができませんでした。 それらはすべて、ポインタ/ポイントされた値をインクリメントするために実行されることを知っています。評価の優先順位や順序についても多くのことがあると思います。最初にポインターをインクリメントしてからそのポインターのコンテンツをフェッチするように、単純にコンテンツをフェッチしてからポインターをインクリメントするなどです。ご覧のとおり、実際の操作について明確に理解していません。できるだけ早くクリアしてください。しかし、それらをプログラムに適用する機会を得たとき、私は本当に迷っています。例えば: int main() { const char *p = "Hello"; while(*p++) printf("%c",*p); return 0; } 私にこの出力を与えます: ello しかし、私の期待はそれが印刷されることでしたHello。最後の1つのリクエスト-特定のコードスニペットで各式がどのように機能するかの例を教えてください。ほとんどの場合、理論のほんの一部だけが私の頭の上を飛んでいきます。
128 c++  c  pointers  increment 

7
C / C ++でサイズ0の配列を定義するとどうなりますか?
int array[0];コードで長さゼロの配列を定義すると、実際にはどうなりますか?GCCはまったく文句を言いません。 サンプルプログラム #include <stdio.h> int main() { int arr[0]; return 0; } 明確化 私は実際に、Darhazerのコメントの可変長のように指されるのではなく、このように初期化された長さゼロの配列が最適化されているかどうかを把握しようとしています。 これは、一部のコードを実際にリリースする必要があるため、SIZEがとして定義されているケースを処理する必要があるかどうかを判断しようとし0ています。int array[SIZE]; 私は実際にGCCが文句を言わないことに驚き、それが私の質問につながりました。私が受け取った回答から、警告がないのは、新しい[]構文で更新されていない古いコードをサポートしていることが主な原因であると思います。 私は主にエラーについて疑問に思っていたので、Lundinの答えに正しいタグを付けています(Nawazの答えが最初でしたが、完全ではありませんでした)。 tまさに私が探していたもの。
127 c++  c  arrays 

3
同じソケットでsend / recvへの並列呼び出しは有効ですか?
同じソケットで、あるスレッドからsendを呼び出し、別のスレッドからrecvを呼び出すことはできますか? 同じソケットの異なるスレッドから複数の送信を並行して呼び出すことはできますか? 優れた設計ではこれを回避する必要があることはわかっていますが、これらのシステムAPIの動作は明確ではありません。私も同じことに関する良いドキュメントを見つけることができません。 方向へのポインタがあれば役立ちます。
127 c  networking  sockets 



5
Python(およびPython C API):__new__と__init__
私が尋ねようとしている質問は、Pythonの__new__と__init__の使用の複製のようです?しかしかかわらず、それは私にはまだ間、まさに実用的な違いは不明だ__new__と__init__あります。 __new__オブジェクトを作成するためのもので__init__あり、オブジェクトを初期化するためのものであると急いで説明する前に、はっきりさせておきます。 実際、C ++で配置newがあり、オブジェクトの割り当てと初期化を分離している経験があるので、その区別は私にとって非常に自然です。 PythonのC APIのチュートリアルでは、このようにそれを説明します: 新しいメンバーは、タイプのオブジェクトを(初期化するのではなく)作成します。__new__()メソッドとしてPythonで公開されています。... 新しいメソッドを実装する1つの理由は、インスタンス変数の初期値を保証することです。 だから、ええ-私は得るものを__new__行いますが、これにもかかわらず、私はまだそれがPythonで便利だ理由を理解していません。与えられた例は、__new__「インスタンス変数の初期値を保証する」場合に役立つ可能性があることを示しています。さて、それはまさに何を__init__するのでしょうか? C APIチュートリアルでは、新しいタイプ(「Noddy」と呼ばれる)が作成され、タイプの__new__関数が定義されている例が示されています。Noddy型にはという文字列メンバーが含まれてfirstおり、この文字列メンバーは次のように空の文字列に初期化されます。 static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { ..... self->first = PyString_FromString(""); if (self->first == NULL) { Py_DECREF(self); return NULL; } ..... } __new__ここで定義されたメソッドがない場合PyType_GenericNew、を使用する必要があることに注意してください。これは、すべてのインスタンス変数メンバーをNULLに初期化するだけです。したがって、この__new__メソッドの唯一の利点は、インスタンス変数がNULLではなく空の文字列として開始されることです。 しかし、なぜこれが便利なのでしょうか。インスタンス変数がデフォルト値に初期化されていることを確認したいのであれば、__init__メソッドでそれを実行できたでしょうか。
126 python  c  python-c-api 

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