Top > C

言語仕様 Edit

volatile 修飾子について Edit

  • volatile はコンパイラにある種の最適化をしないように指示するもの
  • 具体的には、変数をレジスタ変数とせずに必ずメモリ上に取るようにし、ループの中などで勝手に定数に置き換えたりしないようにする
  • 組み込み系ではよく使う。割り込みハンドラの中でアクセスする変数につける。
  • スレッド同期には使えない
  • ローカル変数だけでなくグローバル変数につけることにも意味がある
    http://mkosaki.blog46.fc2.com/blog-entry-91.html
    http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1211423572

C言語標準関数一覧 Edit

http://cham.ne.jp/piro/p_stdfunc.html

変数のスコープ Edit

関数の外で宣言した変数

呼び方(必ずしも一般的ではない)スコープ初期値を指定しなかったときの初期値
グローバルプログラム全体0
staticそのファイルの中だけ0
extern他のファイルで定義したグローバルを使うという宣言externでは初期値を代入しない。本体の定義による

関数の中で宣言した変数

呼び方(必ずしも一般的ではない)スコープ初期値を指定しなかったときの初期値
staticローカルその関数の中だけ0
自動変数その関数の中だけ不定

mallocしたメモリ領域の初期値は不定(ゴミが入っている)

Unixプロセスのメモリマップ Edit

http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-04-17/process-memory.html
http://miettal.hatenablog.com/entry/20130205/1360045859

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

char* comment =
"------------------------------------------------------------\n"
"Unix プロセスのメモリ配置\n"
"\n"
"0xFFFFFFFF\n"
"スタック・セグメント\n"
"      環境変数\n"
"      引数(ソースでの指定と逆順に積んでいく)\n"
"      自動変数(宣言順に積んでいく)\n"
"データ・セグメント\n"
"      ヒープ領域\n"
"      BSS(初期値指定なしを格納。実際にはANSI Cの仕様により0で初期化される)\n"
"      データ(初期値指定ありを格納)\n"
"テキスト・セグメント\n"
"      プログラム\n"
"0x00000000\n"
"------------------------------------------------------------\n"
"\n"
;

#define BYTE(x) (0x000000FF & (x))

int static1 = 123;
int static3;

int main(int argc, char* argv[])
{
    static int static2 = 456;
    static int static4;

    int a;
    int b = 0xABCDEF12;

    char* heap = (char*)malloc(10);

    puts(comment);

    printf("&argc(関数の引数1) =  %u\n", (unsigned int)&argc);
    printf("&argv(関数の引数2) =  %u\n", (unsigned int)&argv);
    printf("&a(自動変数1) = %u\n", (unsigned int)&a);
    printf("&b(自動変数2) = %u\n", (unsigned int)&b);
    printf("&static1(初期値ありstatic) = %u\n", (unsigned int)&static1);
    printf("&static2(初期値ありstatic) = %u\n", (unsigned int)&static2);
    printf("&static3(初期値なしstatic) = %u\n", (unsigned int)&static3);
    printf("&static4(初期値なしstatic) = %u\n", (unsigned int)&static4);
    printf("heap(ヒープ) = %u\n", (unsigned int)heap);

    // プログラム・ブレーク変更(データセグメント拡張)
    void* prevBreak = sbrk(12);
    printf("prevBreak = %u\n", (unsigned int)prevBreak);
    prevBreak = sbrk(0);
    printf("prevBreak = %u\n", (unsigned int)prevBreak);

    printf("printf = %u\n", (unsigned int)printf);

    return 0;
}
&argc(関数の引数1) =  3217320144
&argv(関数の引数2) =  3217320148
&a(自動変数1) = 3217320100
&b(自動変数2) = 3217320096
&static1(初期値ありstatic) = 134519584
&static2(初期値ありstatic) = 134519588
&static3(初期値なしstatic) = 134519604
&static4(初期値なしstatic) = 134519600
heap(ヒープ) = 146010120
prevBreak = 146145280
prevBreak = 146145292
printf = 134513420

逆引き Edit

文字列 Edit

大文字・小文字を区別せず文字列を比較する。 Edit

stricmp

※stricmpはC言語標準関数ではないが一般的に使える。

文字列を分割する(strtok) Edit

#include <stdio.h>
#include <string.h>

int main()
{
    char s[] = "*.asp; *.vbs  ;; *.xls ";
    char* s2;
    char* delim = " \t;"; 
    char* token; 

    // strtok は引数を書き換えてしまうので複製する
    s2 = strdup(s);

    token = strtok(s2, delim);
    while (token != NULL) {
        printf("[%s]\n", token);
        token = strtok(NULL, delim);
    }

    return 0;
}

結果

[*.asp]
[*.vbs]
[*.xls]

文字列を複製する(strdup) Edit

文字列を複製して返す。戻り値は呼び出し側が free() すること。

char* strdup(const char*)

※strdupはC言語標準関数ではないが一般的に使える。

日付 Edit

ファイル・ディレクトリ Edit

正規表現 Edit

その他 Edit

16進ダンプ Edit

#include <stdio.h>

void hexdump(char* ptr, int len)
{
    int i;
    for (i=0; i<len; i++) {
        if (i % 16 != 15)
            printf("%02X ", ptr[i]);
        else
            printf("%02X\n", ptr[i]);
    }
    if (i % 16 != 15)
        putc('\n', stdout);
}

int main()
{
    char* str = "hogehogemogemogepesopeso";
    hexdump(str, strlen(str));
    return 0;
}      

grep Edit



URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes