今天面試總結

第一題,給出給定程序的輸出,程序很簡單,這兒就不寫了。本題關鍵在於sizeof的用法


char a[10] = {1, 2, ..., 10};

#define Total (sizeof(a)/sizeof(a[0]))


關於sizeof的用法,總結如下

sizeof的參數如果是一個對象,比如數組名,結構體名,那麼sizeof的返回值就是該對象佔有內存的空間大小;如果sizeof的參數爲指針,那麼在32位機器上的返回值就是4。下面是我爲了驗證該想法所做的一個實驗。


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

struct Node
{
       char a;
       int b[2];
};

typedef struct Node *ptrToNode;
typedef struct Node List;

int main()
{
    char a[5]={'1', '2', '3', '4', '5'};
    
    char *b = "12345"; 
    
    char c[] = "12345";
    
    printf("%d, %d, %d, %d, %d, %d\n", sizeof(a), sizeof(b), sizeof(c), strlen(a), strlen(b), strlen(c));
    
    printf("%d %d\n", sizeof(ptrToNode), sizeof(List));
    
    return 0;
}

結果爲

5, 4,6, 7, 5, 5

4, 12

從這個例子中可以看出,如果sizeof(c)的話,因爲該對象是一個字符串,因此sizeof也將其尾零統計在內;另外,strlen的原理爲打印出從字符串首字符開始,一直到尾零的前一個字符。所以strlen(a)的長度爲7,因爲在內存中,char[4]之後的字符是不確定的,可能不爲0,因爲strlen的統計不會結束。


第二題,進程所佔用的資源有哪些?linux中有三類典型的線程,分析其各自的特點。


第三題,有三個一維的向量A[N], B[N], C[N], 其中C[i] = A[i] + B[i],用循環可以實現

for(i = 0; i < N; i++)C[i] = A[i] + B[i];

如果使用多線程的話,題目中給了下面的方法

<1, 1, N>開啓 N個 kernel,具體的方法我忘了。。。

如果計算C[N][N] = A[N][N] * B[N][N],如何來做。


第四題,有一個unsigned int的數4,一個int型的數-20,判斷兩數相加是大於0還是小於0;

                已知一個struct的結果,如

struct contain

{

void *p;

itn b;

listhead *next; 

}

現在已知plist = contain.next,能否求出結構體contain的地址。

這個題,我想了兩種辦法,一是由各成員變量的長度去計算,還有就是通過通用鏈表來做,愛立信電話面試就面過這個題,但是後來忘複習了,引以爲戒。


第五題,寫add.h和add.c,實現整數相加的功能,並且頭文件可以被c++程序調用,另外解釋頭文件的代碼主要做了什麼。

這讓我想起#include具體都做些了什麼工作 這個問題。


第六題,各種變量的定義,什麼定義整型變量,指向整型的指針(數組)等等。


編程題

1、用程序獲得鏈表倒數第n個節點

2、刪除字符串中的空格字符

3、寫程序求一數組相鄰元素最大和。

算法題

1、設計算法,實現linux命令行下tab鍵命令補全功能

2、設計算法,將多個字符串按照字母表順序排序,比如ced, agh, bes, opea, owdif,排列後是agh,bes, ced, opea, owdif.


到現在還沒offer,努力!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章