随笔分类 - C/C++
摘要:不知各位對volatile(揮發性的)這個字陌不陌生? 我相信大家在一些程式或多或少都看過這個字眼, 但是究竟要在何種場合用它呢?.當然一定是有需要, C/C++才會有這個保留字, 否則只是增加programmer的困擾而已.有2兩個場合(I/O & multithread program), 供各位參考!.請大家check自己的程式中(尤其是第2個場合), 若有的話請記得加上volatile1. I/O, 假設有一程式片斷如下 U8 *pPort; U8 i, j, k; pPort = (U8 *)0x800000; i = *pPort; j = *pPort; k = *pPo
阅读全文
摘要:/*Title: Linux/x86-64 - setuid(0) & chmod ("/etc/passwd", 0777) & exit(0) - 63 byesDate: 2010-06-17Tested: Archlinux x86_64 k2.6.33Author: Jonathan SalwanWeb: http://shell-storm.org | http://twitter.com/shell_storm! Dtabase of shellcodes http://www.shell-storm.org/shellcode/ 400078
阅读全文
摘要:在學校老師一定都會教void是無型態的返回值例如void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}這樣的函數結束之後不必返回任何數值就在函數名稱前面加上voidvoid 既然是無型態那void *就是無型態的指標了意思是可指向任何類型的指標有點難想像因為我們習慣把void當成只有在無返回值時要用的但是也可以當作無型態的指標也就是可以指向任何型態例如:void *a;int *b;*b = 10;a = b;printf("a: %d \n", *(int *)a);a = b 的時候 a 還是一個無型
阅读全文
摘要:複雜宣告的讀法文法,最令我印象深刻的,莫過於印度工程師Vikram的"The right-left rule"。他是這麼說的:「從最內層的括號讀起,變數名稱,然後往右,遇到括號就往左。當括號內的東西都解讀完畢了,就跳出括號繼續未完成的部份,重覆上面的步驟直到解讀完畢。」舉個例子:void ** (*d) (int &, char*)依下面方式解讀:1. 最內層括號的讀起,變數名稱: d2. 往右直到碰到) : (空白)3. 往左直到碰到( :是一個函數指標4. 跳出括號,往右,碰到(int &, char*): 此函式接受兩個參數:第一個參數是referen
阅读全文
摘要:void * 及Void的用法void含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 void几乎只有“注释”和限制程序的作用,定义一个void变量没有意义,不妨试着定义: void a; 这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。 void真正发挥的作用在于: (1) 对函数返回的限定; (2) 对函数参数的限定。 众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同
阅读全文
摘要:系统级语言C语言的国际标准,完整版。函式原型: int printf ( const char * format, ... );引數說明:%[flags][width][.precision][length]specifier%[旗標][寬度][.精度][長度修飾]資料型態1. 資料型態(%[旗標][寬度][.精度][長度修飾]資料型態)必填欄位(1.1) 字元/字串%c, %C : 字元, char c; %s : 字元陣列, char buffer[MAX_PATH];%S : 字元陣列(Unicode), wchar buffer[MAX_PATH];[註] %C / %S 並未被收在標
阅读全文
摘要:看到網路上一篇blog一個問題,引發一群網友的討論。Q:寫一個函數計算當參數為 n(n很大) 時的值 1-2+3-4+5-6+7……+n這是個常見的級數問題,我們必須化簡成closed form 來得到最佳的效率。一般解法: 主要使用 迴圈long fn(long n) { long temp=0; int i,flag=1; if(n<=0) { printf("error: n must > 0); exit(1); } for(i=1;i<=n;i++) { temp=temp+flag*i; flag=(-1)*flag; } return tem...
阅读全文
摘要:在 C 語言裡,要建立一個字元陣列的字串,常常會使用sprintf()這個函數來做格式化的處理。但是實際上,這個函式卻不是那麼「安全」。怎麼說呢?sprintf()的整個介面長的樣子的是:也就是在使用前,必須要先建立好一個字元陣列的空間,再用這個函式把內容填入,下面就是簡單的例子:int tmp = 10;char cstr[20];sprintf( cstr, "%d * %d = %d", tmp, tmp, tmp * tmp );改用snprintf避免buffer overflowint tmp = 10000;char cstr[20];snprintf( cs
阅读全文
摘要:1 #include<stdio.h> 2 #include<stdlib.h> 3 main() 4 { 5 float x; 6 7 x=-1; 8 int i; 9 for (i=3;i>=0;i--)10 {11 printf("%x",((unsigned char*)&x)[i]);12 }13 14 }或者int i;union { float num; unsigned char n[4]; } q;q.num=-1;for(i=3;i>=0;i--) printf("%x ", q.n[i])
阅读全文
摘要:。前言這是二年級Programming Languages(語言結構)課程中有的內容,教導我們如何斷定一種複雜型態的方法,不過就在經過一年後的最近,我已經忘的差不多了,,在這上面的判斷上又錯誤了,而且還沒有頭緒處理,只能try on'error的將我要的部分測出來用。。問題請問下列的兩種宣告各為 Array of pointer 與 Pointer to Array的哪一種?int (*ptr)[10]; // no.1int *ptr[10]; // no.2。解題方式 - 非正規方法依照優先權來判斷,優先權:()等於[]大於*int (*ptr)[10]; // no.1小括號()
阅读全文
摘要:char** argv == char* argv[]inint main(int argc, char* argv[])e,g: int (* pz)[2]; //a pointer(pz) points to an array of 2 ints.int * pax[2]; // 2 pointersdynamic multi-dimensional arrays in Cfunc(int x, int y, int a[x][y]) { ... }where the array dimensions are specified by other parameters to the fun
阅读全文
摘要:1. 使用在全域變數或全域函式 (Global variable &Global function)讓該變數(或該函式)的可視範圍只侷限在該檔案內,其他的 .c檔看不到此變數(或函式)的存在。既使其他檔案用extern宣告也看不到!套句行話來說,他把Global的變數或函數變成了「internal linkage」,當Linker在找symbol時是會忽略它的。(在C++中也相容這種用法,不過被視為比較不建議的舊的用法,C++比較建議使用unnamed namespace。)使用時機:當此全域變數(或全域函式)不想被其他檔案引用和修改時,或者不同檔案可以使用相同名字的全域變數(或全域函
阅读全文
摘要:AbstractC語言並沒有提供一個函數專門將int, double轉字串,必須透過一個小技巧。Introduction有的compiler有提供itoa()與ltoa()將int, double轉字串,不過這些並非ANSI C標準,真正標準該使用sprintf()。double_to_string.c / C1/*2(C) OOMusou 2008http://oomusou.cnblogs.com34Filename : double_to_string.c5Compiler : Visual C++ 9.0 / Visual Studio 20086Description : Demo
阅读全文
摘要:Its no "string" data style in C language.If you really want string,then usetypedef char* string;So we have to use char array.Beginner always has some mistake here.e.g:Introductionchar s1[] = "Hello World";char *s2 = "Hello World";sizeofs1:12 // s1 is a arraysizeofs2:4 /
阅读全文
摘要:#include <stdio.h>int doAdd(int a, int b) { return a + b; }int doMinus(int a, int b) { return a - b; }int test(int a,int b,int (*suck)(int,int)) {return suck(a,b);}int main(void) {int (*my_func_ptr)(int, int);my_func_ptr = doAdd;printf("function pointer to doAdd => %d\n", (*my_fun
阅读全文

浙公网安备 33010602011771号