1. 程式人生 > >C面試題1

C面試題1

默認 lib 函數 字符串長度 次數 頭文件 錯誤 野指針 倒序

/*
1. a 和 &a 有什麽區別請寫出以下代碼的打印結果
#include<stdio.h>
void main( void )
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
return;
}
a為數組首元素地址,&a為整個數組的地址(長度不同,地址值相同)
2,5
2. sizeof和strlen的區別
sizeof 返回傳入參數所需的存儲空間大小
strlen 只能傳入字符串指針,返回該字符串長度,不包含"\0"
對於字符串,strlen返回值比sizeof小1;
3. 寫一個“標準”宏MIN
#define MIN(x,y) (x) < (y) ? (x) : (y)*/
//4.編碼實現直接插入排序
#include<stdio.h>

int chapai(int *p, int n)
{
int i,j,tem;
for(i = 1; i < n; i++) {
tem = p[i];
for(j = i-1; j >= 0 && p[j] > tem; j--) {
p[j+1] = p[j];
}
p[j+1] = tem;
}

return 0;
}

int main(void)
{
int arr[]={2,6,2,4,8,5,3,9,1,7,1};
int n = 11;

chapai(arr, n);

for(int i = 0; i < n; i++) {
printf("%d,",arr[i]);
}
printf("\n");
return 0;
}
/*
5. 野指針是如何產生的,如何避免
野指針就是指向一個已刪除的變量或者超出作用域的指針
其產生1,定義變量時未賦初值, 如:int *p;
2,指針釋放後未置空,如:p = malloc(sizeof(int)); free(p);
3,超出作用域,如:
int some(int *p)
{
int a = 10;
p = &a;
return 0;
}

避免方法,定義時若不賦初值就先賦值成NULL; free後將指針賦值為NULL; 賦值時
註意作用域*/

/*
6. #include 的是順序是自上而下的,如果頭文件之間有包含依賴關系時,順序不同可
能會導致編譯錯誤;
避免隱含依賴,應采用C標準庫、C++標準庫、其他庫的頭文件、自己工程的頭文件的順
序。不過測試時應先包含自己工程所需要的頭文件,進行測試
尖括號與雙括號的搜索順序不同,尖括號優先搜索系統include目錄,找不到再搜索
源代碼所在目錄,而雙引號則相反,先搜索源代碼目錄後搜索系統默認目錄。故系統頭文件用尖括號,自建頭文件用雙引號。
7. 字節對其可以提高CPU訪問數據的效率;
字節對齊的原則:標準數據類型只要地址是它長度的整數倍。數組按照基本類型對
齊,聯合按包含的長度最大的數據類型對齊。結構體中的每個數據類型都要對齊。
8. 內聯函數是在它所調用的位置展開,其優點可以減少調用次數消除函數調用和返回
所帶來的開銷,優化運行速度。其缺點是代碼會變長,會占用更多的內存空間或指令緩
存。
內聯函數是嵌入代碼,在調用位置不是跳轉,而是直接將代碼寫入進去。對於短小
的多次使用的代碼有一定效率提升,但會增加空間消耗。同是內聯函數要做參數檢查。
而宏函數是在代碼出單純的做文本替換,不進行驗證,使用時容易發生各種錯誤,要減
少使用。
9. 定義一個函數,把一個字符串倒序。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int trans(char *str)
{
int i,n;
n = strlen(str);
char *p = NULL;
p = malloc((n+1) * sizeof(char));
strcpy(p,str);

for(i = 0; i < n; i++) {
str[i] = p[n-1-i];
}
str[n] = ‘\0‘;

return 0;
}

int main(void)
{
char str[] = "abcd";

printf("%s\n",str);

trans(str);

printf("%s\n",str);

return 0;
}

/*
10.
加密
int encry(int n)
{
int g,s,b,k,x;
k = n/1000; k = (k+5)%10;
b = (n/100)%10; b = (b+5)%10;
s = (n/10)%10; s = (s+5)%10;
g = n%10; g = (g+5)%10;

x = g*1000 + s*100 + b*10 + k;

return x;
}
解密
int decry(int n)
{
int g,s,b,k,x;
k -= 5; if(k < 0) k += 10;
b -= 5; if(b < 0) b += 10;
s -= 5; if(s < 0) s += 10;
g -= 5; if(g < 0) g += 10;

x = g*1000 + s*100 + b*10 + k;

return x;
}
*/


C面試題1