c語言的記憶體分配,有很多的注意點。
1. int 的大小問題。int 在不同的編譯器下大小是不一樣的。在tc下是2位,在 vc 下,和 long 一樣,是4位。
2. memset 不是用來分配記憶體的,而是設定某個區域的記憶體為某個值,這個記憶體區域必須是可以修改的,
而且是已經分配好了的。
這個函式的原型為:
void * memset(void * _dst, int _val, size_t _size);
第二個引數是int 實際上有些迷惑人。如果你輸入了乙個大於 256 的數,就會被截斷了。只擷取乙個位元組的資料。
先看下面的**:
chars =
"hello world.";
system(
"cls");
printf(
"before memset.\n");
printf(
"%s\n
", s);
memset(s, '1', 2
);printf(
"after memset.\n");
printf(
"%s\n
",s);
before memset.
hello world.
after memset.
11llo world.
但是,下面的就不對了:
ints[8];
system(
"cls");
printf(
"before memset.\n");
for(
inti =0
; i
<
8; i
++)
putchar('\n
');memset(s, 1,
8);printf(
"after memset.\n");
for(
inti =0
; i
<
8; i
++)
before memset.
-858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460
after memset.
16843009 16843009 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460
這裡只拷貝了兩個位元組。
實際上,因為memset是逐字節拷貝,乙個int 有 4個位元組,這樣
16843009 = 00000001000000010000000100000001。占用了4次拷貝了。
所以,對非char 型別的結構進行 memset 的時候,最好用 0, 或者 -1
0 在計算機內部表示 是 0x00000000
-1 在計算機內部的表示是 0xffffffff
其他的值的初始化基本上沒有意義。
3. 對齊要求
下面這個結構體占用幾個位元組呢?
struct charintsize
;答案是 8個,因為結構體有乙個對齊原則。具體的,不需要知道怎麼對齊,只要知道,不能簡單的加和,而要用 sizeof 計算。
C 的記憶體分配
一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式內區域性變數的儲存單元都可以在...
c 的記憶體分配
c 堆和棧的分配 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等,其操作方式類似於資料結構中的棧。堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式類似於鍊錶。全域性區 靜態區 static 全域性...
c 的記憶體分配
c 的三種記憶體分配方式 1.從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。全域性變數,static變數就是這種分配方式。2.在棧上建立的記憶體。在執行函式內部區域性變數的儲存單元在棧上建立,函式執行結束時伴隨著區域性變數生命週期的結束,這些儲存單元自動被...