数组在编译时内存也确定
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决定。