c語言數組分配
① c語言定義數組時一定要分配空間么
是的,c中數組定義時要指定大小。
當然,萬事也不是絕對的。例如:1.作為形參的時候,可以不指定,因為在函數調用的時候,數組會轉為指針的。2.當為字元串數組時,char
st[]="hello
word"這兒定義了一個st字元數值,不需要你自己去指定大小,系統會自動生成長度為11.
② C語言如何動態分配二維數組
動態分配二維數組:
void main(int argc, char * argv[])
{
int NC=100, NR=200;
int i,j;
char **a; // a[NR][NC] -- *a[NR] -- a[j][i]
a = (char **) malloc(sizeof(char *) * NR);
for (j=0;j<NR;j++){
a[j] = (char *) malloc(sizeof(char) * NC);
}
// 釋放空間: free(a);
編譯錯誤是因為p[j]=(char *)malloc,而不是題目的(char *)malloc(n*sizeof(char))。
(2)c語言數組分配擴展閱讀:
二維數組的動態分配
二維數組A[m][n],這是一個m行,n列的二維數組。設a[p][q]為A的第一個元素,即二維數組的行下標從p到m+p,列下標從q到n+q,按「行優先順序」存儲時則元素a[i][j]的地址計算為:
LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t
按「列優先順序」存儲時,地址計算為:
LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t
存放該數組至少需要的單元數為(m-p+1) * (n-q+1) * t 個位元組。
③ C語言中怎麼動態分配數組
//---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *a=NULL;
int i;
a=malloc(sizeof(int)*10);/*動態創建一個有10個int元素的數組*/
if (a==NULL) { /*a==NULL表示空間分配失敗*/
fprintf(stderr,"MEMORY ERROR");
return -1;
}
for (i = 0; i < 10; i++) {
a[i]=i; /*對數組進行操作*/
}
free(a);/*動態分配的空間需要用free()函數釋放*/
return 0;
}
//---------------------------------------------------------------------------
④ C語言數組定義地址分配問題
使用C語言編程,實際上使用的內存只有一種——虛擬內存。根據功能的不同在C語言中又將虛擬內存為分三類:棧區、堆區、靜態數據區,無論單一變數還是數組,其內存分配都是如此。其中,棧區、靜態數據區、堆區都會有編譯器負責分配、操作系統負責管理,程序員可以在堆區使用malloc()來動態分配堆內存。
1、棧區:一般每一個函數對應一個棧區,在編譯原理中稱為棧幀。比如下面的代碼:
int main()
{
//定義一個有20個int元素的數組。此時數組a分配的虛擬內存稱為棧區,有編譯器自行分配。
int a[20] = {0};
return 0;
}
2、靜態數據區:這實際上對應於生成的可執行文件的.data區段,因為這個區段在生成的可執行文件中,因此是「靜態的」。比如下面的代碼:
//定義一個20個int元素的全局數組,此時數組分配的虛擬內存稱為靜態數據區,有編譯器自行分配。
int g_a[20];
int main() { return 0;}
3、堆區:堆區是最復雜的,有操作系統負責堆管理,但是當用C語言編譯器生成一個可執行文件並且運行時,它會默認建立一些堆。拿Windows來說,每一程序運行,它會建立至少兩個堆,一個是默認堆,一個是new堆。比如下面的代碼:
int main()
{
int *pa = (int*)malloc(sizeof(int)*20);//分配20個int元素大小的堆空間。
return 0;
}
⑤ 怎麼實現C語言裡面數組的動態分配
1 定義指針。
2 使用malloc函數分配內存。
3 對數組進行訪問即可。
對於一維動態數組,直接定義一維指針,並分配內存空間即可。
比如int類型的10個元素動態數組,寫作
int *a;
a = (int *)malloc(sizeof(int) * 10);
如果是多維數組,需要從高維向低維逐層分配。如二維數組10*100空間。
int **a;
int i;
a = (int **) malloc(sizeof(int *) * 10); // 先分配10個int*的空間。
for(i = 0; i < 100; i ++)
a[i] = (int *)malloc(sizeof(int) * 100); // 對於每個int*,分配100個元素的空間。
⑥ C語言中結構體數組的大小如何動態分配
結構體類型數據組就和我們平常定義的基本類型的數組一樣,只不過是類型變了。
基本類型數組動態分配大小:
int* a = (int*)malloc(sizeof(int)*10) ; //動態分配10個大小的int類型的內存空間
結構體類型數組分配大小:
struct DIYDEFINE
{
int a;
char ch;
long lnum;
};
DIYDEFINE* pDiy = (DIYDEFINE*)malloc(sizeof(DIYDEFINE)*10); //動態分配10個大小的結構體類型DIYDEFINE的內存空間。
⑦ c語言數組在內存中是怎麼分配的
C語言中內存為分三類:棧區、堆區、靜態數據區。
局部變數在棧上分配,函數調用前的棧指針,要和函數返回後的棧指針一樣,否則就會出錯。
void test(void)
{
char i,a[10];
printf("0x%x", &i);
printf("0x%x", a);
printf("0x%x", a+1);
printf("0x%x", a+2);
printf("0x%x", a+3);
}
(7)c語言數組分配擴展閱讀
c語言數組在內存分配
示例:
#include<stdio.h>
int main()
{
int a[4] = {11,12,13,14};
int b[4] = {21,22,23,24};
int *pa = &a;
int i = 0;
while(i<8)
{
i++;
printf("now *p value = %d and",*pa);
printf("p addr value = %d ",pa);
pa++;
}
return 0;
}
⑧ C語言數組指針的內存分配問題
s是數組名,對數組名改變數值是錯誤的語句!
s=(char*)malloc(sizeof(char)*1000);
這是錯誤的!
s[0]=(char*)malloc(sizeof(char)*1000);
//這才是分配s[0]
⑨ C語言二維數組內存是怎麼分配的
二維數組在內存中其實是一個平坦的一維數組,下面具體說明:
int
arr[3][5]
和
int
arr[15]
所使用的內存區大小是一樣的,都是15*sizeof(int)個位元組。
如果你做下面這樣一個定義:
union{
int
a[3][5];
int
b[15];
}U;
你會發現
U.a
=
&U.b
U.a[0]
==
&U.b[0]
U.a[1]
==
&U.b[5]
U.a[2]
==
&U.b[10]
&U.a[2][3]
==
&U.b[13]
規律是:
&U.a[m][n]
==
&U.b[m*5+n],其中5就是數組a的第二維度。
實際上,二維數組在運行時也是用這樣的公式轉化為對一維數組的訪問。
⑩ c語言動態分配內存和數組分配各有什麼優缺點
動態分配內存,按需要分配空間,不浪費空間。缺點是不能像數組順序訪問,數組的迭代器加一就可以訪問下一個元素,訪問方便,而且前者注意要釋放內存。數組分配在編譯前必須指定數組大小,而動態分配則很靈活。