C言語
アライメントの勉強をしていて、気になったので実験してみた。 この記事の内容は、下の記事からほとんど抜粋してまとめたもの。めちゃくちゃいい記事だった。 でも、写しているので(僕が)カッコ悪い。 データ型のアラインメントとは何か,なぜ必要なのか? …
C言語における副作用で特に厄介なのがインクリメント・デクリメント演算子なので、特にそれについてまとめておきます。 ちなみに、ここのサイトがめっちゃわかりやすかったです。(C - for文におけるiのインクリメントの前置と後置の違いがわかりません|tera…
そういう前提を置くことでコンパイラが機械語を生成するときにラクできるから、ということらしいです。 まぁ、DSやES、SSをうまく扱うのは難しそう。 ここで実際の確認コードをある掲示板で見つけたので貼っておく。 #include<stdio.h> int main(void) { int i; int *</stdio.h>…
次のようにすると、sint32型のiという変数が.testセクションに配置される。 sint32 __attribute__ ((section (".test"))) i; リンカスクリプトで実際に.dataセグメントに配置してみる。 .data VMAのアドレス : AT (LMAのアドレス) { _stest = .; *(.test) _e…
昔、初心者書籍で嘘が書かれていたことがあったのでまとめておきます。 タイトルの通り、「char array[10];」に対しての「array」と「&array」の意味するものは全く異なります。 結論から言ってしまうと、「arrayはchar*」で「&arrayはchar(*)[10]」という意…
はじめに main関数の前にはスタートアップ関数という物があり、スタートアップ関数ではアプリケーションの実行のための準備がされている。 かといって、スタートアップ関数は特別なプログラムではなく、実際にアプリケーションプログラマが自作することも可…
標準出力(stdout)と標準エラー出力(stderr)の違いについてまとめていく。 標準出力と標準エラー出力の主な違いはリダイレクトできるかできないかの違いが大きいらしい。 標準出力はリダイレクトが行われるが、標準エラー出力の方では普通はリダイレクトが行…
なんだか今は規格で廃止されているかもしれないけど、どのファイルのどの行から呼ばれたかを調べてくれるマクロが紹介されている。コンパイラが色々情報を補って実現されているものらしい。すごい。参考 : 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>…
キャストについてよくわかっていなかったので調べた。 僕がよくわかっていなかったのは、次の3点である。 ・「符号あり・符号なしの間におけるキャスト」 ・「サイズの異なるキャスト」 ・「キャストによってどんな機械語が生成されるのか」 また、ここで対…
仮引数は引数を受け取る側の関数の引数のことで、実引数は関数を呼び出す側で実際に渡す引数のこと。 int main(void){ func(1, 2); // 実引数1, 2 return 0; } void func(int a, int b){ // 仮引数a, b // 処理 } ちょいちょい出てくるけど忘れやすいので...
floatは符号部1bit,指数部8bit,仮数部23bit doubleは上記の順番に1bit, 11bit, 52bit また、指数部にはバイアスがかかっておりfloatは-127、doubleは-1023 仮数部はアドレスが高位なほうから0.5, 0.25, 0.125....と2のマイナスの乗数で表される IEEEという団…
【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>…
構造体の文法について理解が及ばないところがあったので。 時に、下のプログラムは文法上の誤りを含んでいる。 #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>…
printfのフォーマット文字列の部分に「\x1b[A;Bm」を記述すると、そのあとに表示される文字列の属性を変更することができます。 ちなみにAの部分には0か1が入り、0は暗い・1は明るいということらしいです。 Bの部分には何が入るのかイマイチわかりませんが、…
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. 上の二つ…