深圳有方科技筆試題(c語言)

編程和簡答題

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;

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