FromNandの日記

自分的備忘録

C言語

【C言語】アライメントについて【便利なマクロあり!】

アライメントの勉強をしていて、気になったので実験してみた。 この記事の内容は、下の記事からほとんど抜粋してまとめたもの。めちゃくちゃいい記事だった。 でも、写しているので(僕が)カッコ悪い。 データ型のアラインメントとは何か,なぜ必要なのか? …

C言語における副作用完了点とは?

C言語における副作用で特に厄介なのがインクリメント・デクリメント演算子なので、特にそれについてまとめておきます。 ちなみに、ここのサイトがめっちゃわかりやすかったです。(C - for文におけるiのインクリメントの前置と後置の違いがわかりません|tera…

C言語ではDS, ES, SSを同じ値にしなければならないのはなぜか?

そういう前提を置くことでコンパイラが機械語を生成するときにラクできるから、ということらしいです。 まぁ、DSやES、SSをうまく扱うのは難しそう。 ここで実際の確認コードをある掲示板で見つけたので貼っておく。 #include<stdio.h> int main(void) { int i; int *</stdio.h>…

C言語プログラムの中でセクションを作成する方法

次のようにすると、sint32型のiという変数が.testセクションに配置される。 sint32 __attribute__ ((section (".test"))) i; リンカスクリプトで実際に.dataセグメントに配置してみる。 .data VMAのアドレス : AT (LMAのアドレス) { _stest = .; *(.test) _e…

「char array[10];」に対して、式中での「array」「&array」の違いについて

昔、初心者書籍で嘘が書かれていたことがあったのでまとめておきます。 タイトルの通り、「char array[10];」に対しての「array」と「&array」の意味するものは全く異なります。 結論から言ってしまうと、「arrayはchar*」で「&arrayはchar(*)[10]」という意…

【main関数の前の世界】スタートアップ関数を自作してみた!

はじめに main関数の前にはスタートアップ関数という物があり、スタートアップ関数ではアプリケーションの実行のための準備がされている。 かといって、スタートアップ関数は特別なプログラムではなく、実際にアプリケーションプログラマが自作することも可…

標準出力(stdout)と標準エラー出力(stderr)の違いについて

標準出力(stdout)と標準エラー出力(stderr)の違いについてまとめていく。 標準出力と標準エラー出力の主な違いはリダイレクトできるかできないかの違いが大きいらしい。 標準出力はリダイレクトが行われるが、標準エラー出力の方では普通はリダイレクトが行…

【C言語マクロ】どのファイルの何行目から呼ばれているかを調べる方法

なんだか今は規格で廃止されているかもしれないけど、どのファイルのどの行から呼ばれたかを調べてくれるマクロが紹介されている。コンパイラが色々情報を補って実現されているものらしい。すごい。参考 : Finding out where a function was called from - E…

多次元配列の各点におけるアドレスを表示する

おそらく理解はできているのだが、実際に表示させてみる。 #include<stdio.h> int main(void){ int i; char array[10][10][10][10]; // arrayは「int(*)[10][10][10]」、&arrayは「int(*)[10][10][10][10]」、&array[0]はarrayと同様「int(*)[10][10][10]」を指してい</stdio.h>…

【C言語】C言語におけるキャストの働きについて調べてみた

キャストについてよくわかっていなかったので調べた。 僕がよくわかっていなかったのは、次の3点である。 ・「符号あり・符号なしの間におけるキャスト」 ・「サイズの異なるキャスト」 ・「キャストによってどんな機械語が生成されるのか」 また、ここで対…

【C言語】仮引数と実引数の違い

仮引数は引数を受け取る側の関数の引数のことで、実引数は関数を呼び出す側で実際に渡す引数のこと。 int main(void){ func(1, 2); // 実引数1, 2 return 0; } void func(int a, int b){ // 仮引数a, b // 処理 } ちょいちょい出てくるけど忘れやすいので...

【C言語】浮動小数点数の内部表現について

floatは符号部1bit,指数部8bit,仮数部23bit doubleは上記の順番に1bit, 11bit, 52bit また、指数部にはバイアスがかかっておりfloatは-127、doubleは-1023 仮数部はアドレスが高位なほうから0.5, 0.25, 0.125....と2のマイナスの乗数で表される IEEEという団…

【C言語】ヘッダファイルの書き方

【1】すべてのヘッダファイルにはインクルードガードをつけるべき。 // これを書くことで重複インクルードがなくなる #ifndef _HEADER_H #define _HEADER_H // 処理を書いていく #endif 【2】あるヘッダファイルAが常にあるヘッダファイルBに依存するとき、…

関数のポインタを返す関数へのポインタを返す関数を作ってみた

コードはこれ #include<stdio.h> void a(void){ printf("a\n");} void b(void){ printf("b\n");} void c(void){ printf("c\n");} void d(void){ printf("d\n");} void (*func(int num))(){ switch(num){ case 'a': return a; case 'b': return b; case 'c': return c;</stdio.h>…

【C言語】構造体名は構造体への先頭アドレスを表すか?

構造体の文法について理解が及ばないところがあったので。 時に、下のプログラムは文法上の誤りを含んでいる。 #include<stdio.h> struct STR { int a, b, c; }; int main(void){ struct STR str; printf("str = %p, &str = %p, &str.a = %p\n", str, &str, &str.a); </stdio.h>…

【C言語】文字列にアンダーラインを入れたり、色を変えたりする方法

printfのフォーマット文字列の部分に「\x1b[A;Bm」を記述すると、そのあとに表示される文字列の属性を変更することができます。 ちなみにAの部分には0か1が入り、0は暗い・1は明るいということらしいです。 Bの部分には何が入るのかイマイチわかりませんが、…

【C言語】constについて気をつけることとか

const指定子がめんどくさいのでまとめておく 参考 : const修飾子について - Qiita 例えば次のコード const int *i; i is pointer to read-only int. int const *i; i is pointer to read-only int. int * const i; i is read-only pointer to int. 上の二つ…