面接まとめ~~付:メモリコピー関数mymemcpy

2003 ワード

一昨日、大学城のある会社にC/C++実習生の面接に行きました.
面接が始まる前に、一時間の問題をしました.前の選択問題はまあまあですが、基本的にはC/C++の基礎知識やデータ構造の知識ですが、まだ見たことのない知識点があります.それから簡単な解答問題で、これらはすべて比較的に熟知していて、答えたのは所定の位置にあるべきです.次はプログラムの問題です.1つ目はメモリレプリケーション関数を書くことです.メモリが重なる場合を考慮する必要があります.この問題は最後まで書けなかった.第2題は一方向チェーンテーブルの反転で、簡単に書けました.最後の問題は設計問題です.主にデータから無駄な記録や重複した記録を取り除く(時間が足りず、最後にこの問題を終わらせなかった).この問題はLinuxコマンドでもコードを書くのも簡単だと思いますが、コードなら、正則的に役に立つかどうか、hasnで繰り返すかどうかを判断します.(個人的な考え方).
時間になったら、面接を始めます.基本的に履歴書に書いてあることを聞きました.私は理論の知識を身につけていないので、多くの理論問題に答えられず、大部分は自分の理解に基づいて答え、緊張を加えて、答えがめちゃくちゃになっています.
多くの理論的なものが答えられなかったので、面接はすぐに終わり、30分ぐらいかかりました.最後に、面接官は私に理論の知識を重視することを提案して、後でとても大きい助けがあります.面接官のアドバイスに感謝します.
 
次に、理論知識を重視し、それぞれの知識点を深く理解します.自分はやはり水が多すぎて、努力を続けなければなりません.
次に,筆記試験問題で作成されなかったメモリコピー関数を解決する.
関連資料を探して、メモリコピー関数を書くポイントがわかりました.
1.空のポインタかどうかを判断します.
2.タイプがvoid*で自増できないので、先に強制的にchar*に変換します.
3.メモリが重複しているかどうかを判断します.2つのケースに分けられます.2つのメモリアドレスをfromとtoとし、countバイト(1)toアドレスをfromとfrom+countの間にコピーします(2)fromはtoとto+countの間にあります.この2つのケースは重複するケースに属する.
サンプルコード:
#include 
using namespace std;

void *mymemcpy(void *to, void *from, int count)
{
    if(to == NULL || from == NULL)
        return NULL;

    unsigned char *ch_to = (unsigned char *)to;
    unsigned char *ch_from = (unsigned char *)from;
    if((ch_to >= ch_from && ch_to < ch_from + count) || (ch_from >= ch_to && ch_from < ch_to + count))
        return NULL;

    while(count--)
    {
        *ch_to = *ch_from;
        ++ch_to;
        ++ch_from;
    }
    return to;
}

int main()
{
    int a[5];
    int b[5] = {1,2,3,4,5};
    for(int i = 0; i < 5; ++i)
        cout << b[i] << ',';
    cout << endl;
    if(!mymemcpy(a, b, 5 * sizeof(int)))
        cout << "failed" << endl;
    else
    for(int i = 0; i < 5; ++i)
        cout << a[i] << ',';
    cout << endl;
    return 0;
}

引き続き努力して、自分が実习を探し当てることができることを信じます!~~