---
# System prepended metadata

title: 建興儲存韌體工程師 2024/11
tags: [面試]

---

## 面試時間:2024/11
### 1.Struct, Union and Enum
```
typedef unsigned char mUINT_8;
typedef unsigned short mUINT_16;
typedef unsigned int mUINT_32;

typedef struct
{
    mUINT_8 bA;
    mUINT_8 bB;
    mUINT_8 bC;
    mUINT_8 bD;
} testStruct;

typedef union
{
    mUINT_32 dwAll;
    testStruct stPart;
} testUnion;

enum
{
    LOW = 0x10,
    MID,
    HIGH
};

int main ()
{
    //Test struct, union and enum
    testUnion stTemp;
    testUnion *pTemp;
    
    // ***
    pTemp = &stTemp;
    pTemp->stPart.bD = HIGH;
}
```
A.請問上述testStruct, testUion和enum各需要佔用幾個Bytes?
* Ans:
```
testStruct: 4, testUion: 4, enum: 4
```
B.請寫一行程式印出stTemp的值，以及執行結果可能為何?
* Ans:
```
printf("stTemp.dwAll = %x\n", stTemp.dwAll);
```
>stTemp.dwAll = 12000000


C.
```
// Test struct ary initialize
mUINT_32 dwIdx=0;
mUINT_16 *bPtr;
testStruct structAry[]=
{
    {1,2,3},
    {4,5,6}
};
bPtr = (mUINT_16 *)structAry;
for(dwIdx=0; dwIdx < 8; dwIdx++)
{
    printf("(struct.i%d) = %0x%X\n", dwIdx, *(bPtr+dwIdx))
}
```
假設下表是structAry，表的最左側是記憶體起始位置，左側為低位，每格表示1 Byte。請利用程式的宣告及下表的列印資訊，把記憶體的值填入並將下面列印的值補齊(i0~i3)。(testStruct結構宣告在題目1)
|1|2| | | | | | |0x89|0x25|0x40|0x00|0|0|0|0|
|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|

(structAry.i0)=0x
(structAry.i1)=0x
(structAry.i2)=0x
(structAry.i3)=0x
(structAry.i4)=0x2589
(structAry.i5)=0x40
(structAry.i6)=0x0
(structAry.i7)=0x0

* Ans:
```
(structAry.i0) = 0x0201
(structAry.i1) = 0x0003
(structAry.i2) = 0x0504
(structAry.i3) = 0x0006
(structAry.i4) = 0x2589
(structAry.i5) = 0x0040
(structAry.i6) = 0x0000
(structAry.i7) = 0x0000
```

### 2. Queue and Stack:
A.簡述兩者的差別
* Ans:

1. Queue (佇列)：
    * 遵循先進先出（FIFO）原則。
    * 插入操作在尾端，移除操作在頭端。
2. Stack (堆疊)：
    * 遵循後進先出（LIFO）原則。
    * 插入和移除操作都發生在頂端。

B.請在下圖中簡述各個區塊利用方式(eg. Code, Global/ Local/ static variables..)
|Stack|
|-|
| |
|Heap|
|BSS|
|Data|
|Text|

* Ans:
> Text	儲存程式的可執行指令（機器碼）。
> Data	儲存已初始化的全域變數和靜態變數。
> BSS	儲存未初始化的全域變數和靜態變數（記憶體初始化為 0）。
> Heap	動態記憶體分配區（例如 malloc、free）。
> Stack	儲存函數呼叫堆疊，包括區域變數、參數和返回地址。

C.簡述Static的作用

* Ans:
>靜態變數（static）在編譯期間分配記憶體。
>* 作用範圍：
>全域靜態變數： 作用於當前檔案，不會暴露給其他檔案。
>區域靜態變數： 作用於函數內，但其值在多次函數呼叫之間保持不變。

### 3.Call by value 與 call by address
A.請簡述兩者差別
* Ans:
> 1. Call by Value（值傳遞）：
> 傳遞參數的副本，函數內對變數的修改不會影響到原變數。
> 2. Call by Address（地址傳遞）：
> 傳遞變數的地址，函數內對地址所指向變數的修改會影響到原變數。



B.請根據下列程式碼，寫出列印的結果
```
typedef struct{
    int total;
    int index;
    int nextIndex;
}FormInfo;

void FormUpdate(FormInfo *TempForm, int amount)
{
    amount = amount + 100;
    TempForm->total = amount;
}

int main()
{
    FormInfo CurForm;
    int base_count = 9;
    
    CurForm.total = 0;
    CurForm.index = 0;
    
    FormUpdate(&CurForm, base_count);
    
    printf("%d\n", CurForm.total);
    printf("%d\n", base_count);
}
```
* Ans:
```
109
9
```
### 4.請簡述何謂Finite-state machine(FSM)?
* Ans:
> FSM 是一種計算模型，由有限數量的狀態、轉換規則和事件組成。
> * 一個 FSM 包含：
    > 1. 狀態集（States）：描述系統的所有可能狀態。
    > 2. 轉換（Transitions）：由觸發條件引起狀態改變。
    > 3. 初始狀態（Initial State）：開始時的狀態。
    > 4. 事件（Events）：驅動狀態轉換。


### 5.使用volatile宣告的variable特性?
* Ans:
> 告訴編譯器變數的值可能會被異步更新（如中斷或硬體）。
> 編譯器不應對該變數進行優化，保證每次訪問都直接讀取記憶體中的最新值。


### 6.Linked-List(程式題C/C++)
A.請宣告一個struct node供linked list使用須包含以下element:
1. prev(記錄前一node)
2. nxt(記錄下一node)
3. int data
4. int num(記錄list中第幾號node，start from 0)

B.將一維陣列{5,9,10,2,4,3,7}依序放入struct data中並串為list。(需有head, tail兩pointer)

* Ans:
```
typedef struct node {
    struct node *prev;
    struct node *nxt;
    int data;
    int num;
} Node;

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

typedef struct node {
    struct node *prev;
    struct node *nxt;
    int data;
    int num;
} Node;

int main() {
    int arr[] = {5, 9, 10, 2, 4, 3, 7};
    int size = sizeof(arr) / sizeof(arr[0]);

    Node *head = NULL, *tail = NULL, *temp = NULL;

    for (int i = 0; i < size; i++) {
        temp = (Node *)malloc(sizeof(Node));
        temp->data = arr[i];
        temp->num = i;
        temp->nxt = NULL;
        temp->prev = tail;

        if (tail) {
            tail->nxt = temp;
        } else {
            head = temp;
        }
        tail = temp;
    }

    // Print Linked List
    Node *current = head;
    while (current) {
        printf("Node %d: Data = %d\n", current->num, current->data);
        current = current->nxt;
    }

    return 0;
}
```