答.volatile提醒編譯起它後面所定義的變量隨時都有可能發生改變,因此編譯後的程序每次需要存儲或讀取這個變量的時候,都會直
(1)中斷服務程序中修改的供其他程序檢測的變量需要加volatile;
(2)多任務環境下各任務間共享的標志因該加volatile;
(3)存儲器映射的硬件寄存器通常也要加volatile,因為每次對它的讀寫都可能有不同意義。
答.
(1)應用層:應用程序間溝通的層,如簡單電子郵件傳輸(SMTP)、文件傳輸協議(FTP,file transfer protocol)、網絡遠程訪問協
與 TCP 不同, UDP 並不提供對 IP 協議的可靠機制、流控制以及錯誤恢復功能等。由於 UDP 比較簡單, UDP 頭包含很少的字節,
tcp: 提供穩定的傳輸服務,有流量控制,缺點是包頭大,冗余性不好
udp: 不提供穩定的服務,包頭小,開銷小
答.
預編譯又稱為預處理,是做些代碼文本的替換工作。處理#開頭的指令,比如拷貝#include包含的文件代碼,#define宏定義的替換,
c和c++中struct的主要區別是c中的struct不可以含有成員函數,而c++中的struct可以。c++中struct和class的主要區別在於默認的
*((void (*)( ))0x100000 ) ( );
首先要將0x100000強制轉換成函數指針,即:
(void (*)())0x100000
然後再調用它:
*((void (*)())0x100000)();
用typedef可以看得更直觀些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
進程是死的,只是一些資源的集合,真正的程序執行都是線程來完成的,程序啟動的時候操作系統就幫你創建了一個主線程。
每個線程有自己的堆棧。
void GetMemory(char **p,int num)
{
*p=(char *)malloc(num);
}
int main()
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
free(str);
if(str!=NULL)
{
strcpy(str,"world");
}
printf("\n str is %s",str); 軟件開發網 www.mscto.com
getchar();
}
問輸出結果是什麼?
輸出str is world。
free 只是釋放的str指向的內存空間,它本身的值還是存在的.所以free之後,有一個好的習慣就是將str=NULL.
此時str指向空間的內存已被回收,如果輸出語句之前還存在分配空間的操作的話,這段存儲空間是可能被重新分配給其他變量的,
盡管這段程序確實是存在大大的問題(上面各位已經說得很清楚了),但是通常會打印出world來。
這是因為,進程中的內存管理一般不是由操作系統完成的,而是由庫函數自己完成的。
當你malloc一塊內存的時候,管理庫向操作系統申請一塊空間(可能會比你申請的大一些),然後在這塊空間中記錄一些管理信息
意識到這個表達式將使一個16 位機的整型數溢出-因此要用到長整型符號L,告訴編譯器這個常數是的長整型數。
如果你在你的表達式中用到UL(表示無符號長整型),那麼你有了一個好的起點。記住,第一印象很重要
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
這一問題測試你是否知道為了訪問一絕對地址把一個整型數強制轉換(typecast)為一指針是合法的。這一問題的實現方式
隨著個人風格不同而不同。典型的類似代碼如下:
int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa55;
#define rWTCON (*(volatile unsigned *)0x53000000)
{
unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<= 6");
}
(1)關鍵字typedef在編譯階段有效,由於是在編譯階段,因此typedef有類型檢查的功能。
Define則是宏定義,發生在預處理階段,也就是編譯之前,它只進行簡單而機械的字符串替換,而不進行任何檢查。
(2)Typedef用來定義類型的別名
(3)#define沒有作用域的限制,只要是之前預定義過的宏,在以後的程序中都可以使用。而typedef有自己的作用域。
或“<=”形式。如果寫成if (x == 0.0),則判為錯。if ((x >= - EPSINON) && (x <= EPSINON)
#include <assert.h>
void assert( int expression );
char *GetMemory( void )
{
char p[] = "hello world";
return p;
}
{
char *str = NULL;
str = GetMemory();
printf( str );
}
return p;
的p[]數組為函數內的局部自動變量,在函數返回後,內存已經被釋放。這是許多程序員常犯的錯誤,
其根源在於不理解變量的生存期
快速法:
{
unsigned int c =0 ;
for (c =0; n; ++c)
{
n &= (n -1) ; // 清除最低位的1
}
return c ;
}
{
// 建表
unsigned char BitsSetTable256[256] = {0} ;
for (int i =0; i <256; i++)
{
BitsSetTable256[i] = (i &1) + BitsSetTable256[i /2];
}
unsigned char* p = (unsigned char*) &n ;
BitsSetTable256[p[1]] +
BitsSetTable256[p[2]] +
BitsSetTable256[p[3]];
}