C語言中的初始化及記憶體分配

2021-05-24 23:15:17 字數 1526 閱讀 3752

很多字串在用

strcpy

拷貝時會報錯或者直接賦值時會出現亂碼,都是因為沒有初始化。

char *str = (char *)malloc(sizeof(char));

memset(str,0,sizeof(char));即可

有時在編譯時並不知道陣列的長度,可以這樣動態分配陣列

乙個自定義結構體的初始化

mystuct mystr;

memset(&mystr,0,sizeof(mystr));

和下面皆可

mystuct *mystr;

memset(mystr,0,sizeof(*mystr));

如果是二維的陣列,在初始化時能否直接將宣告的二維陣列的陣列名傳遞給乙個指標呢

?編譯後就會發現是有問題的,一維陣列的陣列名即為指向該陣列的指標,該指標值儲存了陣列存放在記憶體中的一塊連續區域的起始位址,所以陣列的下標就表示了這片記憶體區域的某儲存區相對於起始位址的偏移量;而二維陣列在概念上遠比一維陣列複雜,或者說二維陣列以一種晦澀的方式構建在一維陣列之上。

之前在c++部落格裡看見過一篇文章,記了一點筆記如下:

事實上,計算機系統的多維陣列其實最終還是以一維陣列的形式實現的。就

n x m

的二維陣列來講,設其陣列名為

array

。指標array

指向乙個陣列,該陣列存放的是一系列指標,這些指標分別指向相應的一維陣列,而這些陣列中存放的才是我們的資料。

array -> [

一維陣列指標

1] ->[

一維陣列,m長

] [一維陣列指標

2] ->[

一維陣列,m長

] ………… [

一維陣列指標

n] ->[

一維陣列,m長

] 由此可見

array是第i

個指標變數位址,

array[j]

則表示相對於第

i個指標變數偏移

j*sizeof(

陣列型別)。

系統通過這種機制訪問了該

n*m維陣列的第

i行,第

j列的內容。

所以,對於乙個二維陣列

mystuct mystr[n][m]

,就需要用陣列指標或二維指標來表示了。

初始化的方法有兩種

mystruct **des = malloc(n*sizeof(mystruct*));

for(int i = 0;i

des[i] = malloc(m*sizeof(mystruct));

下面這個例子是兩個一維指針對二維陣列的操作

初始化之後的記憶體拷貝就簡單多了,利用函式

memcpy

,物件指標必須初始化。另外,通過記憶體拷貝對資料型別沒有約束,這也是下面一片文章說的

cstring

轉char*

能用ct2a

巨集的方法,如果用

strcpy

或直接=

賦值都無法達到效果。

Java物件的記憶體分配及初始化

public class square public class testsquare 1.程式開始執行時,testsquare被類載入器載入進入記憶體,main方法由於是static方法首先pop到棧中 2.接著就是new square 類載入器載入square類,對類中的成員變數和方法進行初始化...

C語言中的初始化問題

經常在c語言工程中,尤其是比較大的程式,執行過程中會出現由於記憶體或堆疊導致的各種問題,輸出錯誤或執行崩潰 1.字串陣列的初始化 1 char str 10 2 char str 10 3 char str 10 str 0 0 2.字元陣列的初始化 int a 5 錯誤 int a 5 只有第乙個...

C語言中結構體的初始化

大全 建議在變數定義的時候進行初始化,但是很多人,特別是新人對結構體或者結構體陣列定義是一般不會初始化,或者不知道怎麼初始化。1 初始化 typedef struct test t test t test t gst 可以初始化,設定i為1,s為乙個字串.test t gst 初始化個數少於實際個數...