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语言动态分配内存和数组分配各有什么优缺点
动态分配内存,按需要分配空间,不浪费空间。缺点是不能像数组顺序访问,数组的迭代器加一就可以访问下一个元素,访问方便,而且前者注意要释放内存。数组分配在编译前必须指定数组大小,而动态分配则很灵活。