C/C++基础知识10道题,你都会吗?
題目1:指針基礎知識
題述:描述指針數組和數組指針(指向數組的指針)的區別并舉例
考察點:C指針的基礎知識
答案:考慮如下
char *q[] = {“xxx”, “xxx”, “xxx”}; 指針數組,q[0] 為一個指針
char (*p)[] = a; 數組指針,p[0] 為一個變量
時間:1min
題目2:內存分配
題述:描述c程序內存分配方式以及它們的區別(5分鐘)
考察點:編程基礎
參考答案:
1) 從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static 變量。
2) 在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集。
3) 從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc 或new 申請任意多少的內存,程序員自己負責在何時用free 或delete 釋放內存。動態內存的生存期由程序員決定。
題目3:讀程序找錯
問題:【找錯類】下面的程序用于讀取整數,整數的范圍在1和從標準輸入讀取的size之間,它返回每個值出現的次數,這個程序包含了幾個錯誤,請指出。(10min)
#include <stdlib.h>
Int * frequency(int size)
{
Int *array;
Int i;
array= (int *)malloc(size *2);#獲得足夠的內存來容納計數
#調整指針,讓它后退一個整形位置,這樣就可以使用范圍1-size的下標
Array-=1;
#把各個元素清零
For(i=0;i<size;i++)
Array[i]=0;
#計數每個值出現的次數,然后返回結果
While(scanf("%d",&i) == 1) #scanf的返回值代表成功讀入的個數
Array[i] +=1;
Free(array);
Return array;
}
錯誤點:
(1) 用字面值常量2作為整型值的長度,這個值在整型值長度為2個字節的機器上能正常工作,但在4字節整數機器上,實際分配的內存將只是所需內存的一半,所以應該用sizeof
(2) 從malloc函數返回值未被檢查,如果內存不足,將返回NULL
(3) 把指針退到數組左邊界的左邊來調整下標的范圍或許行得通,但它違背了標準關于指針不能越過數組左邊界的規定。
(4) 指針經過調整后,第一個元素的下標變成了1,接著for循環將錯誤地從0開始。在許多系統中,這個錯誤將破壞malloc所使用的用于追蹤堆的信息,常常導致程序崩潰
(5) 數組增值前并未檢查輸入值是否位于合適的范圍內;
(6) 如果數組應該被返回,它就不能被free掉
題目4:讀程序確認返回值
求函數返回值,輸入x=9999;
int func(int x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
【問題】請寫出該函數的返回值以及分析過程。(10分鐘)
參考答案:8
解這道題的時候,如果拿出一個二進制數來分析就會容易的多了,x=x&(x-1)實際上就是把x的二進制形式的最后一個“1”變成“0”,x的二進制形式有多少個“1”循環就執行多少次。
9999/256 = 39 余 15,把這兩個數分別轉化一下就很快了
39 = 32 + 4 + 2 +1 = 00100111
15 = 0f = 00001111
所以 9999=0010011100001111,共有8個1,答案就是 8 了
考察點:c編程基礎知識
題目5:實現strndup函數
請編寫以下功能的函數:char *strndup(char *src, int n); 復制字符串src,返回新的指針地址,最多復制n個字節(包括字符串結束的'\0')。該題目的審查要點是:
l是否檢查參數的有效性:src, n;
l是否能正確使用內存申請函數和指針;
l對于"最多復制n個字節"的要求考慮是否周到
題目6:合并兩個有序鏈接
合并兩個有序(升序)鏈接。
typedef struct _link_t
{
int val;
struct _link_t *next;
} link_t;
link_t* merge(link_t* ln1, link_t* ln2);
題目7
(本題答案不全):實現子序列最大和
給定一個int 數組,給出其中連續子序列的最大和
unsigned int foo(int *arr, size_t len);
例子1: 數組[-2,11,-4,13,-5,2]中具有最大累加和的子數組為[11,-4,13],其和為20;
例子2:[1, -3, 4, -2, -1, 6] 中具有最大累加和的子數組為[4, -2, -1, 6], 其和為7。
題目8
(本題答案不全):字符串排序
有一個由字母(大小寫)組成的字符串,要求對其排序,要求效率盡可能高且輔助空間盡可能少。
實現 void sort(char* s); 返回寫入s。
題目9
(本題答案不全):字符串反轉
寫代碼反轉一個字符串,要求交換的次數和輔助空間盡量少。
實現 void reverse(char* s);返回寫入s。
題目10(本題答案不全):樓梯走法
走樓梯可以一次上1級,也可以一次上兩級,請問上n級臺階有幾種走法。n不超過10K,要求效率盡可能高。
實現 unsigned int count(unsigned int n);
?
總結
以上是生活随笔為你收集整理的C/C++基础知识10道题,你都会吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云炬随笔20211017(4)
- 下一篇: 推荐3款移动端网页开发调试神器