C記憶體分配的注意點

2022-03-06 07:27:55 字數 1635 閱讀 7751

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.在棧上建立的記憶體。在執行函式內部區域性變數的儲存單元在棧上建立,函式執行結束時伴隨著區域性變數生命週期的結束,這些儲存單元自動被...