linux興味グループ2017面接問題の概要

10239 ワード

linux興味グループ2017面接問題
1.以下のプログラムの出力を分析する.
int main(int argc, char *argv[])
{
    int t = 4;
    printf("%lu
"
, sizeof(t--)); printf("%lu
"
, sizeof("ab c
t\012\xa1*2"
)); return 0; }
  • printf("%d",t)を実行すると;結果は4である、sizeofはキーワードであり、その後の内容はコンパイル時に演算して演算後の数値に置き換えられ、プログラム実行時に直接置換値を呼び出し、t-の演算を行わないため、tは依然として4である.
  • sizeof演算を行う場合、,012,xa 1はそれぞれ1文字であり、終端記号0を含む.

  • 2.次のコードは何を出力しますか?
    int main(int argc, char *argv[])
    {
        int a = 10, b = 20, c = 30;
        printf("%d %d
    "
    , b = b*c, c = c*2) ; printf("%d
    "
    , printf("%d ", a+b+c)); return 0; }
  • printf関数の動作機構はスタック上で記憶空間を申請するものであり、規則は先進的で後出であるため、printf()はパラメータが右から左に演算する、すなわちc=60(c=2)、b=1200(b=c)として表現する.
  • printf関数の戻り値は、印刷文字の列幅(長さ)である.
  • 3.次のコードは正しいですか?正しい場合は、コードの役割を説明してください.正しくない場合は、エラーを指摘して修正してください.
    void get_str(char *ptr)
    {
        ptr = (char*)malloc(17);
        strcpy(ptr, "Xiyou Linux Group");
    }
    int main(int argc, char *argv[])
    {
        char *str = NULL;
        get_str(str);
        printf("%s
    "
    , str); }
  • 主関数のポインタ変数strは空のポインタを指し、パラメータとして関数get_に伝達されるstr時にptrに渡すと、変調関数ではptrが指すメモリアドレスのみがmalloc関数申請の空間となり、主関数のstrは空のポインタを指し、文字は出力.
  • 解決方法:1)2次ポインタ
    void get_str(char **ptr)
    {
        *ptr = (char*)malloc(17);
        strcpy(*ptr, "Xiyou Linux Group");
    }
    int main(int argc, char *argv[])
    {
        char *str = NULL;
        get_str(&str);
        printf("%s
    "
    , str); }
    を使用)関数戻り値を使用して新しいアドレスを
    char * get_str(char *ptr)
    {
        ptr = (char*)malloc(17);
        strcpy(ptr, "Xiyou Linux Group");
        return ptr;
    }
    int main(int argc, char *argv[])
    {
        char *str = NULL;
        str = get_str(str);
        printf("%s
    "
    , str); }
  • に戻す.
    4.次のコードの出力結果を説明してください.
    size_t q(size_t b)
    {
            return b;
    }
    size_t (*p(char *str))(size_t a)
    {
            printf("%s
    "
    , str); return q; } int main(int argc, char *argv[]) { char str[] = "XiyouLinuxGroup"; printf("%lu
    "
    , p(str)(strlen(str))); return 0; }
  • この問題の考察の点は戻り値が関数ポインタの関数である(詳細は『LinuxCプログラミング実戦』P 78参照).
  • size_t(*p(char*str))(size_t a)は、戻り値が関数ポインタである関数である、まずpを見ると、()の優先度が*より高いため、pは先に()と結合する、p(char*str)は文字型ポインタパラメータを含む関数であり、戻り値はsize_t(*)(size_t a)であり、関数を指すポインタである.このポインタが指す関数はsize_です.t型のパラメータ

  • 9.次のプログラムの実行結果を説明します.
    int main(int argc, char *argv[])
    {
        int a, b = 2, c = 5;
        for(a = 1; a < 4; a++)
        {
            switch(a)
            {
                b = 99;
                case 2:
                printf("c is %d
    "
    , c); break; default: printf("a is %d
    "
    , a); case 1: printf("b is %d
    "
    , b); break; } } return 0; }
  • 出力結果:
    b is 2
    c is 5
    a is 3
    b is 2
  • switchのcaseの上の文(付与文、出力文など)はスキップされ、本題ではb=99と表現される.スキップされるため、bの値は依然として2.
  • である.
    14.intタイプのパラメータもdoubleタイプのパラメータも交換できるように、次のswap関数を変更してください.
    void swap(int *a, int *b)
    {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
  • は、マクロによって定義することができる:
    #define swap(a, b) ((x)=(x)+(y),(y)=(x)-(y),(x)=(x)-(y))
  • パラメータを追加すると、数字が占めるバイト数を表し、memcpy関数を使用します.
    void swap(int *a, int *b, int size)
    {
    char buffer[8];
    memcpy(buffer, a, size);
    memcpy(a, b, size);
    memcpy(b, buffer, size);
    }
  • 16.コマンドラインパラメータでファイル名filenameを受信するプログラムを設計してください.txt(純テキストファイル)と整数nとをfilenameから実現する.txtでn行目のデータを削除します.
    詳しい内容は10種類の解法を見てください
    17.解釈プログラム出力結果
    struct node
    {
        char a;
        short b;
        int c;
    };
    int main(int argc, char *argv[])
    {
        struct node s;
        memset(&s, 0, sizeof(s));
        s.a = 3;
        s.b = 5;
        s.c = 7;
        struct node *pt = &s;
        printf("%d
    "
    , *(int*)pt); printf("%lld
    "
    , *(long long *)pt); return 0; }
  • 本題は主に の問題を考察する.
  • サイズ端子:一般的なコンピュータは、記憶時に「低位が前、高位が後」という小さな端子を採用している.例えば、整数型1は記憶時にバイナリコードが0000...0001(31個0,1個1)であり、メモリに記憶する場合、実際の記憶順序は
    00000001
    00000000
    00000000
    00000000
  • である.
  • コンピュータがメモリコンテンツを読み取る速度を向上させるために採用したメモリ整列方法では、各変数が格納するヘッダアドレスは、自身が占めるメモリサイズの整数倍でなければならない.この構造体ではaが1バイト、bが2バイト、cが4バイトを占めるため、a、bの間に空バイトがなければ、cヘッダアドレスは3(ヘッダアドレスを0とする)となり、bヘッダアドレスは1となり、規則に合致しないため、aの後に空バイト(内容はすべて0)を追加し、技能的な内蔵位置合わせを行う.
  • 強制タイプ変換:(int*)ptを例に、この配列をint型に強制変換する.すなわち、読み出し時に最初の4バイトの内容だけを読み出し、整数出力に変換する.
  • 詳しくはお年寄りのブログ
  • をご覧ください