編程和簡答題
1. static全局便娘與普通全局變量有什麼區別?static局部變量和普通局部變量有什麼區別?satic函數與普通函數有什麼區別?
static全局變量只初使化一次,防止在其他文件單元中被引用(修改鏈接屬性);
static局部變量只被初始化一次,下一次依據上一次結果值(延長生命期);
static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
2. 有雙向循環鏈表節點定義爲
struct node
{
int data;
struct nod *front, *next;
};
有兩個雙向鏈表A,B,知道其頭指針爲:pHeadA,pHeadB,請寫一個函數將兩個鏈表中的data值相同的節點刪除
3. 使用自旋鎖時應注意哪些方面
4.字符串倒序程序,類似將"innos"倒序後變爲"sonni",請指出下面代碼有哪些錯誤並修正:
#include "string.h"
int main(void)
{
char *pDest, *pSrc;
char *src = "neoway";
char *dest = NULL;
int length = strlen(src);
dest = malloc(length);
pDest = dest;
pSrc = src[length];
while(length-- != 0)
pDest++ = pSrc--;
printf("%s", dest);
return 0;
}
正確程序如下
#include<stdio.h>//要包含這兩個頭文件
#include<stdlib.h>
#include "string.h"
int main(void)
{
char *pDest, *pSrc;
char *src = "neoway";
char *dest = NULL;
int length = strlen(src);
dest = (char *)malloc(length + 1);//多一個空間存儲字符串結束符
pDest = dest;
pSrc = src + length - 1;//注意下表從0開始src[length]的值爲'\0'
while(length-- != 0)
*pDest++ = *pSrc--;//掉了*
*pDest = '\0';
printf("%s", dest);
free(dest);//這裏要釋放一下
return 0;
}
5. 假如一套代碼適應不同項目工程D1,D2,D3,每個項目有自己獨立的編譯頭文件d1.h,d2.h,d3.h,但3個項目共用了同一個c文件file1.c,在file1.c中共用同一個字符串數組char baseband_version[30],該數組用於定義版本號,比如abcd_D1,abcde_D2,abfe_D3分別用於三個項目的版本號,請用代碼實現各項目只編譯生成對應的baseband_version。6. 下面一段代碼的作用是從I/O空間.x100端口的內容讀取2次值,inWord爲讀取函數,這段代碼是否有隱患,如果有如何修改?
int a,b,c;
a = inWord(0x100);/*讀取I/O空間0x100端口的內容存入a變量*/
b = a;
a = inWord(0x100);/*再次讀取I/O空間0x100端口的內容存入a變量*/
c = a;
有隱患,上述代碼編譯器一般會優化成如下代碼
int a,b,c;
a = inWord(0x100);
b = a;
c = a;
若避免隱患需要加volatile關鍵字,這樣編譯器就不會優化
volatile int a;
int b,c;
a = inWord(0x100);/*讀取I/O空間0x100端口的內容存入a變量*/
b = a;
a = inWord(0x100);/*再次讀取I/O空間0x100端口的內容存入a變量*/
c = a;