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

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

6
多次元配列はどのようにメモリ内でフォーマットされますか?
Cでは、次のコードを使用して、2次元配列をヒープに動的に割り当てることができます。 int** someNumbers = malloc(arrayRows*sizeof(int*)); for (i = 0; i < arrayRows; i++) { someNumbers[i] = malloc(arrayColumns*sizeof(int)); } 明らかに、これは実際には、整数の個別の1次元配列の束へのポインターの1次元配列を作成します。 someNumbers[4][2]; しかし、次の行のように2D配列を静的に宣言すると...: int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS]; ...同様の構造がスタック上に作成されますか、それとも完全に別の形式ですか?(つまり、ポインターの1D配列ですか?そうでない場合、それは何ですか、そしてそれへの参照はどのように理解されますか?) また、私が「システム」と言ったとき、それを理解するために実際に責任があるのは何ですか?カーネル?または、Cコンパイラはコンパイル中にそれを分類しますか?

3
GCCがほぼ同じCコードに対して、このように根本的に異なるアセンブリを生成するのはなぜですか?
最適化されたftol関数を書いているとき、私はいくつかの非常に奇妙な動作を見つけましたGCC 4.6.1。最初にコードを示します(明確にするために、違いを示しました)。 fast_trunc_one、C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent = 150 - ((i >> 23) & 0xff); sign = i & 0x80000000; if (exponent < 0) { r = mantissa << -exponent; /* diff */ } else { r …

8
brk()システムコールは何をしますか?
Linuxプログラマのマニュアルによると: brk()およびsbrk()は、プロセスのデータセグメントの終わりを定義するプログラムブレークの場所を変更します。 ここでデータセグメントはどういう意味ですか?それは単なるデータセグメントですか、それともデータ、BSS、およびヒープの組み合わせですか? wikiによると: データ、BSS、およびヒープ領域は、まとめて「データセグメント」と呼ばれることがあります。 データセグメントのみのサイズを変更する理由はわかりません。それがデータ、BSS、およびヒープの場合は、ヒープがより多くのスペースを取得するため、理にかなっています。 それでは、2つ目の質問をさせていただきます。これまでに読んだすべての記事で、著者はヒープが上向きに成長し、スタックが下向きに成長すると言っています。しかし、彼らが説明していないのは、ヒープがスタックとスタックの間のすべてのスペースを占有するときに何が起こるかです。
184 c  linux  unix  memory-management  brk 

16
Cファイルを1行ずつ読み取る
ファイルから行を読み取るために、この関数を書きました。 const char *readLine(FILE *file) { if (file == NULL) { printf("Error: file pointer is null."); exit(1); } int maximumLineLength = 128; char *lineBuffer = (char *)malloc(sizeof(char) * maximumLineLength); if (lineBuffer == NULL) { printf("Error allocating memory for line buffer."); exit(1); } char ch = getc(file); int count = 0; …
184 c  file-io  line  std 


8
引数の数に関するマクロのオーバーロード
私は2つのマクロFOO2とFOO3: #define FOO2(x,y) ... #define FOO3(x,y,z) ... 新しいマクロFOOを次のように定義したい: #define FOO(x,y) FOO2(x,y) #define FOO(x,y,z) FOO3(x,y,z) ただし、マクロは引数の数をオーバーロードしないため、これは機能しません。 変更することなく、FOO2かつFOO3、マクロを定義するためにいくつかの方法がありますFOO(使用して__VA_ARGS__ディスパッチのと同じ効果を得るため、またはそれ以外)FOO(x,y)にFOO2、およびFOO(x,y,z)にはFOO3?
183 c  macros  c-preprocessor 

22
インラインアセンブリ言語はネイティブC ++コードよりも遅いですか?
インラインアセンブリ言語とC ++コードのパフォーマンスを比較しようとしたので、サイズ2000の2つの配列を100000回追加する関数を作成しました。これがコードです: #define TIMES 100000 void calcuC(int *x,int *y,int length) { for(int i = 0; i < TIMES; i++) { for(int j = 0; j < length; j++) x[j] += y[j]; } } void calcuAsm(int *x,int *y,int lengthOfArray) { __asm { mov edi,TIMES start: mov esi,0 mov ecx,lengthOfArray label: mov …
183 c++  c  performance  assembly 

2
C99の「restrict」キーワードの現実的な使用法
私はいくつかのドキュメントと質問/回答を閲覧していて、それが言及されているのを見ました。私は簡単な説明を読み、基本的にはポインターが他の場所を指すために使用されないことがプログラマーからの約束であると述べました。 誰かが実際にこれを使用する価値があるいくつかの現実的なケースを提供できますか?
183 c  gcc  c99  restrict-qualifier 

10
pthreadの条件変数関数にミューテックスが必要なのはなぜですか?
私は読んでいpthread.hます。条件変数に関連する関数(などpthread_cond_wait(3))には、引数としてミューテックスが必要です。どうして?私が知る限りでは、その引数として使用するためだけにミューテックスを作成しますか?そのミューテックスは何をすることになっているのですか?

8
文字列を適切に比較するにはどうすればよいですか?
ユーザーが単語や文字を入力して保存し、ユーザーがもう一度入力してプログラムを終了するまで印刷できるプログラムを取得しようとしています。私のコードは次のようになります: #include <stdio.h> int main() { char input[40]; char check[40]; int i=0; printf("Hello!\nPlease enter a word or character:\n"); gets(input); printf("I will now repeat this until you type it back to me.\n"); while (check != input) { printf("%s\n", input); gets(check); } printf("Good bye!"); return 0; } 問題は、ユーザーによる入力(チェック)が元の(入力)と一致する場合でも、入力文字列の印刷を取得し続けることです。2つを誤って比較していますか?
182 c  string  strcmp 


6
Objective-CでENUMを定義して使用するにはどうすればよいですか?
以下に示すように、実装ファイルで列挙型を宣言し、インターフェイスでその型の変数をPlayerState thePlayerStateとして宣言しました。私のメソッドで変数を使用しました。しかし、それが宣言されていないというエラーが出ます。メソッドでPlayerState型の変数を正しく宣言して使用するにはどうすればよいですか? .mファイル @implementation View1Controller typedef enum playerStateTypes { PLAYER_OFF, PLAYER_PLAYING, PLAYER_PAUSED } PlayerState; .hファイル内: @interface View1Controller : UIViewController { PlayerState thePlayerState; .mファイルのいくつかのメソッドで: -(void)doSomethin{ thePlayerState = PLAYER_OFF; }
180 iphone  objective-c  c 

16
CおよびC ++の静的変数はどこに保存されますか?
実行可能ファイルのどのセグメント(.BSS、.DATA、その他)に静的変数が格納されているため、名前の衝突が発生しませんか?例えば: foo.c: bar.c: static int foo = 1; static int foo = 10; void fooTest() { void barTest() { static int bar = 2; static int bar = 20; foo++; foo++; bar++; bar++; printf("%d,%d", foo, bar); printf("%d, %d", foo, bar); } } 両方のファイルをコンパイルして、fooTest()とbarTestを繰り返し呼び出すメインにリンクすると、printfステートメントは個別に増分します。fooおよびbar変数は翻訳単位に対してローカルであるため、理にかなっています。 しかし、ストレージはどこに割り当てられていますか? 明確にするために、ELF形式でファイルを出力するツールチェーンがあることを前提としています。したがって、これらの静的変数のために実行可能ファイルに予約されたスペースが必要になると思います。 議論のために、GCCツールチェーンを使用すると仮定します。


10
Switchステートメント:デフォルトは最後のケースでなければなりませんか?
次のswitchステートメントを検討してください。 switch( value ) { case 1: return 1; default: value++; // fall-through case 2: return value * 2; } このコードはコンパイルされますが、C90 / C99に対して有効(=定義済みの動作)ですか?デフォルトのケースが最後のケースではないコードを見たことがありません。 編集: として、ジョン・ケージとKillianDS書き込み:これは本当に醜いと混乱のコードであり、私はそれをよく知っています。一般的な構文(定義されているか?)と期待される出力に興味があります。

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