數組在編譯時內存也確定
A. c語言中什麼時候可以這樣定義數組"int a[]"
不可以。知
數組在編譯時編譯器就會在內存中根據該數組的長度給它分配內存單元。(即編譯時長度已經定了)
故而數組必須定義道其長度,且一旦定義,在系統運行中不可變,要麼用整形數直接定義,要麼通過直接初始化,編譯內器根據初始化的元素個數自動確定該數組的長度。
定義時,方括弧內不可以為容變數,但是允許:
int
n=5;
int
a[n];
這樣的語句是可以的。
B. 數組在內存中如何存儲,存放哪些信息。
首先糾正一點,sizeof是得出類型大小,不是數組大小,之所以你認為是數組大小,估計是char a[10];sizeof(a) == 10 得出的感覺吧?其實是這么算的,sizeof(char)*10
你要了解在內存中的存放,你可以看一下C內存分布,有助了解,具體很多,自己查查
樓上說數組是指針的特例。。。別搞笑行不行,兩者完全是兩碼事
C. 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);
}
(3)數組在編譯時內存也確定擴展閱讀
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;
}
D. C語言裡面的數組都是在編譯的時候就分配好內存的嗎
編譯的時候 只是確定了內存的大小
實際分配還是在運行時分配的
否則 無數的C語言程序 每一個都分配一段內存
卻不運行 電腦受不了的
E. c++ 數組大小必須在編譯時確定 請教
不一定的啊。
如果是動態分配的數組就可以在運行的時候再確定大小。
比如
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int size,inx;
cout<<"input mem size:"<<endl;
cin>>size;
int *p = new int[size];
memset(p,0x00, sizeof(int) * size);
for (inx=0; inx!=size; ++inx) p[inx]= inx+1;
for (inx=0; inx!=size; ++inx) cout<<p[inx]<<"\t"<<endl;
return 0;
}
F. 數組大小是什麼
數組的大小是指數數組中存儲的數據的數量,或數組的長度,數組大小一旦確定就不能改變。
數組長度必須在編譯時確定,您可以使用malloc函數在程序運行時動態分配所需的「數組」長度。定義一個數組需要指定數組的長度,系統會為這個長度分配固定數量的內存。
當intarray[10]出現;在這種情況下,它不能被更改,在這種情況下,變數的存儲空間在堆棧中。當intn;bb0 > n. Intarray = newint [n]。
當數組可以根據n個輸入的大小分配內存時,此時,數組有一個堆區域。
(6)數組在編譯時內存也確定擴展閱讀:
在標准C和c++中,長度為0的數組是不允許的。如果使用長度為0的數組,則編譯和轉換時將發生錯誤。但是在GNUC中,這種用法是合法的。
它最典型的用途是數組中的最後一項,主要用於方便內存緩沖區管理。如果一個長度為0的數組被指針代替,分配內存有兩個步驟:
1.需要為結構主體分配內存空間。
2.然後為結構中的成員變數分配內存空間。因此,分配的內存是不連續的,需要單獨管理。當使用長度為0的數組時,原則是立即將所需的所有內存分配給它,反之亦然。
G. C語言動態內存分配,不是說運行時才確定數組么,咋么還是人為輸入n的值呢
通常,C/C++的數組是在編譯前決定其大小的,如 int a[N];,其中N必須是常量,而動態內存分配則可以在運行時決定大小,如 int *pa;(定義一個指針,但沒有分配承裝數據的空間),scanf("%d",&n);(讀入數組大小),pa = (int *)malloc(n * sizeof(int));(在堆內存分配空間,並將首地址返回給指針pa)。顯然,二者之間的區別是明顯的。
H. 編譯原理:靜態數組的存儲空間可以在編譯時確定。這句話為什麼是錯的。請給出詳細原因,謝謝。
靜態數組指的是寫代碼期間就知道大小的數組,比如int a[10];
char s[] = "hello";
這個靜態和動態分配相區別,不要和static弄混了,static/extern/auto是用於說明變數的存儲方式——也就是說,靜態數組也可以是static的,也可以是extern的,也可以是auto的。
舉個例子,下面就是一個靜態數組,但是存儲方式是auto的。
voidtest()
{
inta[10];
}
這個數組的存儲空間無法在編譯時候確定,只能在運行期間確定,原因是:盡管可以確定數組的大小,但是不能確定它的首地址。
再比如:
static int sa[10] = {0};
這個數組的存儲空間在編譯時,就可以確定了。
I. 為什麼數組要在編譯期確定大小
從變成方面來看:定義一個數組是要用到數據類型的(byte,short,int,long,float,double,char)的, 而調用這些數據類型會在堆中建立該數組的對象,如果想要這個數組有值,那就一定會在數據區開區間,建立該對象的值。所以數組如果要有意義,編譯期肯定要賦值。否則雖然不會報錯,但莫名其面佔用存儲空間總歸不好。
J. 關於C語言中數組分配內存等問題!額,本人是菜鳥,被一C語言書上的話弄暈了! 如果我的問題有些怪,請見諒
1. 准確地說,局部變數是在該函數被調用的時候才會得到所分配的內存空間。但是該內存空間的分配形式是在編譯的時候就確定了的。
2. char a[10]也會自動被初始化為10個'\0'字元。
3. 一般的數組都是靜態數組。動態數組的申請方式一般為:
int *a=malloc(sizeof(int) * 10); // 這個語句申請了一個能容納10個int的動態數組。
靜態數組的意思是:數組的大小在程序編譯完就確定了。動態數組的意思是:數組的大小要程序運行起來之後才知道。
比如 int a[10];那麼它固定死了,就是10個元素大小。
但動態分配方式就不一定。比如:
int n;
....
int *a= malloc(sizeof(int)*n); //分配了一個動態數組。數組大小由n決定。