話說字串處理在C語言是很常用的,在使用時要注意的地方很多。一般在複製字串不外以下幾個function:
memcpy/strncpy/snprintf
各有其使用時機。strncpy看起來多一個n來指定複製長度,以避免overflow,乍看之下是很安全的,但結束符號常常是一個問題,導致結果和預期的不符。請見以下範例
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
kezeodsnx 發表在 痞客邦 留言(1) 人氣(3,016)
c的macro真是博大精深,真要自己搞一些特異功能的macro腦子就不夠使了,但,至少要會抄!
C語言巨集定義技巧
kezeodsnx 發表在 痞客邦 留言(0) 人氣(15,543)

這次有兩個主題:
1. unix domain socket IPC
2. 傳structure
先看流程圖
kezeodsnx 發表在 痞客邦 留言(0) 人氣(20,814)
事情發生在不同的processor對於 byte order會有相反的狀況,因此有了所謂的Big-endian和Little-endian。
對一個32-bit 整數0x12345678來說
1. Little-endian如intel的processor,在記憶體的順序為
address value
kezeodsnx 發表在 痞客邦 留言(0) 人氣(2,080)
const的位置決定修飾的對像,如 char const *p表示修飾的是*p,所以不能用*p='a',而p這個address是可以修改的,比如p=&q。
如果是char* const p,則表示修飾的是p這個address。所以可以用*p='a',而不能p=&q。這兩個是相反的例子。
再來是都不能修改的狀況,const char* const p,則*p跟p都不能再賦值了。
最後const是左修飾,所以 const char跟 char const是一樣的意思。
kezeodsnx 發表在 痞客邦 留言(0) 人氣(1,129)
variable的modifier定義其特性,這次討論static與extern:
static variable: 其值是會保留在記憶體的,不隨著離開其scope而消失 (只initialize一次)。
extern variable: 該變數已在其他地方(包括其他file)被定義過了,存取的方式是先宣告為extern,再來存取。
看例子:
kezeodsnx 發表在 痞客邦 留言(0) 人氣(577)
已知
1. int 4 bytes = 32 bits, char 1 byte = 8bits
2. 負數以2's complement 儲存
3. %d是signed integer %u是unsigned integer。做型別轉換時,需要做sign extention,方式為不足的bit補其符號(即正補0,負補1)。
kezeodsnx 發表在 痞客邦 留言(0) 人氣(2,779)

現有一段程式如下:
#include <iostream>
using namespace std;
int main() {
int p = 10;
int *ptr1 = &p;
int **ptr2 = &ptr1;
cout << "p的值:" << p << endl;
cout << "p的記憶體位置: " << &p << endl;
cout << endl;
cout << "*ptr1 = " << *ptr1 << endl;
cout << "ptr1 = " << ptr1 << endl;
cout << "ptr1的記憶體位置: " << &ptr1 << endl;
cout << endl;
cout << "**ptr2 = " << **ptr2 << endl;
cout << "*ptr2 = " << *ptr2 << endl;
cout << "ptr2 = " << ptr2 << endl;
cout << "&ptr2 = " << &ptr2 << endl;
cout << endl;
return 0;
}
kezeodsnx 發表在 痞客邦 留言(2) 人氣(1,726)
玩linux多多少少會看到一個用法 do xxx while(0)。從邏輯上來看,似乎沒什麼特別的,甚至會懷疑是否多此一舉 (while 0不就是直接跳出嗎?)。事實上,這是有一定用途的,主要是避免文法錯誤。在define macro時,只有一個語句,如#define foo(x) bar(x); 這樣多半不會有問題。但較複雜的macro搭配if else等flow control時,就會產生文法上的問題,看下例:
#define foo(x) bar(x); qoo(x);
int main(int argc, char* argv[])
{
if(1)
foo(1);
else
printf("in else\n");
}
kezeodsnx 發表在 痞客邦 留言(2) 人氣(18,889)
變數的宣告,會配置其所需的記憶體。每種變數所需的大小不一樣,比如說char是1 bytes,int 是4 bytes,double則是8
bytes。如果是這樣,那這些大小在記憶體中是如何擺放呢?是直覺的一個接一個放嗎?其實不然。這牽扯到performance /
efficiency的問題! 在32 bits的架構上,一次的資料存取也就是32 bits (4 bytes)。而這4 bytes
不是隨便從哪個點抓都可以,而是以4 bytes為單位,不管需要的是其中那個byte,就抓那4個bytes。比如說,抓第0,4,8
,12....等,而不會是從3,7,9開始抓4個bytes。
kezeodsnx 發表在 痞客邦 留言(4) 人氣(44,055)