很多字串在用strcpy拷貝時會報錯或者直接賦值時會出現亂碼,都是因為沒有初始化。
char *str = (char *)malloc(sizeof(char));
memset(str,0,sizeof(char));即可
有時在編譯時間並不知道數組的長度,可以這樣動態分配數組
size = get_size();</p><p>int *p = new int[n];</p><p>for(int *q=p;q!=p+n;++q)</p><p>...</p><p>delete []p;</p><p>
一個自訂結構體的初始化
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<N;i++)
des[i] = malloc(M*sizeof(MYSTRUCT));
下面這個例子是兩個一維指標對二維數組的操作
void double_div()</p><p>{</p><p> int score[3][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};</p><p> int *p1,*p2;</p><p> int i;</p><p> for(p1=*score;p1<=*(score+2);p1=p1+4)/* score+i終究還是地址 */</p><p> {</p><p> for(p2=p1;p2<p1+4;p2++)</p><p> {</p><p> if(*p2<60)</p><p> {</p><p> for(i=0;i<4;i++)</p><p> {</p><p> printf("%d ",*(p1+i));</p><p> }</p><p> printf("/n");</p><p> }</p><p> }</p><p> }</p><p>}</p><p>
初始化之後的記憶體拷貝就簡單多了,利用函數memcpy,對象指標必須初始化。另外,通過記憶體拷貝對資料類型沒有約束,這也是下面一片文章說的CString轉char*能用CT2A宏的方法,如果用strcpy或直接=賦值都無法達到效果。
float a = 3.12;</p><p>float b = 0.0;</p><p>void *data;</p><p>data = malloc(sizeof(float));//4</p><p>memcpy(data,&a,sizeof(float));</p><p>memcpy(&b,data,sizeof(float));<br />